您的位置:首页 > 其它

socket模式和模型概念

2016-09-06 22:33 281 查看
当使用socket()函数和WSASocket()函数创建套接字时,默认的套接字都是阻塞的。

1 一个套接字是阻塞的,那么它的recv()、recvfrom()、WSARecv()和WSARecvfrom()、send()、sendto()、WSASend()和WSASendto()、accept()和WSAAcept()、connect()和WSAConnect()函数就是阻塞的. 

  一个套接字是非阻塞的,那么它的recv()、recvfrom()、WSARecv()和WSARecvfrom()、send()、sendto()、WSASend()和WSASendto()、accept()和WSAAcept()、connect()和WSAConnect()函数就是非阻塞的.
2 套接字模式与I/O模型的关系:
  套接字模式是定义一个SOCKET的行为方式.阻塞的SOCKET, 它在执行SEND时,发送不成功,SEND函数不会返回,程序也就不能向下执行. 非阻塞send, 成功不成功都返回,根据返回值来判断是否成功.如果不成功,你还要继续的调用.
  I/O模型是当你的程序中有多个SOCKET的话, 如何管理它们以让他们达到最高的工作效率.
   比如说wsasyncselect模型, 把一个socket和一个windows procedure联系起来,把这个socket设成非阻塞的,它send了一个数据返回了,即使他不成功,你也不用再来调用了,当它可以发送时,OS会给windows procedure发消息的.
如果你把它改成阻塞的了,那么你就失去了使用I/O模型的意义了.
<1>
SOCKET s;
s = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);//默认为阻塞模式
ioctlsocket(s,FIONBIO,1);//s被设置为非阻塞模式
send(s,buf,len,flags);//s被设为非阻塞模式后,直至再次把s设为阻塞前,其后续操作如send,recv等都是非阻塞的。

<2>
SOCKET s;
s = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);//s被允许重叠IO
WSASend(s,buf,1,numberOfBytesSent,flag,overlapped,NULL);//在重叠套接字上的操作,如WSASend,WSARecv等,如果填写了overlapped结构作为参数,都是重叠IO操作的。同时,这些操作也是非阻塞的,不需要显式调用ioctlsocket。(另一个解释:若随一个
WSAOVERLAPPED 结构一起调用这些函数,WSASend、WSASendTo、WSARecv、WSARecvFrom、WSAIoctl、AcceptEx、TrnasmitFile、函数会立即完成并返回,无论套接字是否设为阻塞模式。此时这些函数就默认相当于非阻塞模式了)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: