资源描述:
《次课windows套接字IO模型》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、复习1IP特点2TCP与UDP区别3基于TCP连接的两个程序的通信过程4基于UDP的两个程序的通信过程1IO模型的6种形式阻塞选择WSAAsyncSelectWSAEventSelect重叠overlapped完成端口completionport2阻塞模式Recv函数的调用会使程序进入等待状态,直到接收到数据才返回。Accept函数的调用也进入等待状态,直到有连接才返回此模式容易理解,但如果有多个套接字连接时,就必须创建多个线程,一个连接使用一个线程。因此实际开发中使用最多的还是非阻塞模式3SOCKETsServSock;sockaddr_
2、inaddr;intnSockErr,nNumConns;SOCKETsConns[5];sockaddrConnaddrs[5];intnAddrLen=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,(LPSOC
3、KADDR)&addr,sizeof(addr))==SOCKET_ERROR){nSockErr=WSAGetLastError();return;//Handleerror,Donotcontinue}if(listen(sServSock,2)==SOCKET_ERROR){//监听客户连接请求nSockErr=WSAGetLastError();return;//处理错误,不再继续}4Listen发生错误一般由于绑定没有成功引起Shutdown与closesocket的区别5while(nNumconns<5){sConns[nNu
4、mConns]=accept(sServSock,ConnAddrs[nNumConns],&nAddrLen);//接受连接if(sConns[nNumConns]=INVALID_SOCKET){nSockErr=WSAGetLastError();return;//处理错误}else{//新socket已经成功地连接StartNewHandleThread(sConns[nNumConns]);nNumConns++;}}6网络信息查询函数(1)getpeername()功能:获取通信方的套接字地址信息。格式:intPASCALFAR
5、getpeername(SOCKETs,structsockaddrFAR*name,intFAR*namelen);s:已连接的套接字。name:接收端地址的名字结构。namelen:一个指向名字结构长度的指针。(2)getscokname()功能:该函数是getpeer的对应函数。获取指定套接字的本地地址信息。格式:intPASCALFARgetsockname(SOCKETs,structsockaddrFAR*name,intFAR*namelen);s:标识一个已绑定套接字的描述字。name:接收套接口的地址(名字)。namele
6、n:一个指向名字结构长度的指针。7阻塞模型典型示例大多数Winsock应用都是遵照一种“生产者/消费者”模型来编制的。在这种模型中,应用程序需要读取(或写入指定数量的字节。然后以它为基础执行一些计算。如下所示是一个典型的例子。SOCKETsock;charbuff[256];intdone=0;…while(!done){recv(sock,buff,65);DoComputationOnData(buff);}这段代码的问题在于,只有从系统缓冲区读取数据,才允许返回。如果系统没有读取数据,可能永远无法返回。解决这个问题的办法是将应用程序划
7、分为一个“读线程”和一个“计算线程”。两个基本点线程共享一个数据缓冲区。“读线程”的职责是从网络连续地读入数据,并将其置入共享缓冲区中。在“读线程”将计算线程开始工作需要的数据量拿到手后,便会触发一个事件,通知计算进程可以工作了。随后,计算线程从缓冲区中取走(删除)一个数据块,然后进行计算。8非阻塞模式使用函数ioctlsocket显式让套接字工作在非阻塞模式U_longul=1;SOCKETs=socket(AF_INET,SOCK_ETREAM,0);Ioctlsocket(s,FIONBIO,(u_long*)&ul);非阻塞模式下函
8、数调用将立即返回,有一个出错代码,说明没有完成该函数,需要对相同函数调用多次,直到它返回成功为止。为了免去这样的麻烦,可以使用windows提供的不同IO模型对IO端口进行管理,