第三次课windows套接字IO模型.pptVIP

  • 3
  • 0
  • 约7.22千字
  • 约 27页
  • 2017-05-29 发布于北京
  • 举报
复习 1 IP特点 2 TCP与UDP区别 3 基于TCP连接的两个程序的通信过程 4 基于UDP的两个程序的通信过程 IO模型的6种形式 阻塞 选择 WSAAsyncSelect WSAEventSelect 重叠overlapped 完成端口completion port 阻塞模式 Recv函数的调用会使程序进入等待状态,直到接收到数据才返回。Accept函数的调用也进入等待状态,直到有连接才返回 此模式容易理解,但如果有多个套接字连接时,就必须创建多个线程,一个连接使用一个线程。因此实际开发中使用最多的还是非阻塞模式 SOCKET sServSock; sockaddr_in addr; int nSockErr,nNumConns; SOCKET sConns[5]; sockaddr Connaddrs[5]; int nAddrLen=sizeof(sockaddr); sServSock=socket(AF_INET,SOCK_STREAM,0); //建立socket对象 addr.sin_family=AF_INET; addr.sin_port=htons(5050); //为socket分配端口 addr.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(sServSock,(LPSOCKADDR)addr,sizeof(addr))==SOCKET_ERROR) { nSockErr=WSAGetLastError(); return; //Handle error,Do not continue } if(listen(sServSock,2)= = SOCKET_ERROR){//监听客户连接请求 nSockErr=WSAGetLastError(); return;//处理错误,不再继续 } Listen发生错误一般由于绑定没有成功引起 Shutdown与closesocket的区别 while(nNumconns5) { sConns[nNumConns]=accept(sServSock,ConnAddrs[nNumConns],nAddrLen); //接受连接 if(sConns[nNumConns]=INVALID_SOCKET) { nSockErr=WSAGetLastError(); return; //处理错误 } else { //新socket已经成功地连接 StartNewHandleThread(sConns[nNumConns]); nNumConns++; } } 网络信息查询函数 (1)getpeername() 功能:获取通信方的套接字地址信息。 格式:int PASCAL FAR getpeername( SOCKET s, struct sockaddr FAR* name,int FAR* namelen); s:已连接的套接字。 name:接收端地址的名字结构。 namelen:一个指向名字结构长度的指针。 (2)getscokname() 功能:该函数是getpeer的对应函数。获取指定套接字的本地地址信息。 格式:int PASCAL FAR getsockname( SOCKET s, struct sockaddr FAR* name,int FAR* namelen); s:标识一个已绑定套接字的描述字。 name:接收套接口的地址(名字)。 namelen:一个指向名字结构长度的指针。 阻塞模型典型示例 大多数Winsock应用都是遵照一种“生产者/消费者”模型来编制的。在这种模型中,应用程序需要读取(或写入指定数量的字节。然后以它为基础执行一些计算。如下所示是一个典型的例子。 SOCKET sock; char buff[256]; int done=0; … while(!done){ recv(sock,buff,65); DoComputationOnData(buff); } 这段代码的问题在于,只有从系统缓冲区读取数据,才允许返回。如果系统没有读取数据,可能永远无法返回。解决这个问题的办法是将应用程序划分为一个“读线程”和一个“计算线程”。两个基本点线程共享一个数据缓冲区。“读线程”的职责是从网络连续地读入数据,并将其置入共享缓冲区中。在“读线程”将计算线程开始工作需要的数据量拿到手后,便会触发一个事件,通知计算进程

文档评论(0)

1亿VIP精品文档

相关文档