socket模式和模型概念

当使用socket()函数和WSASocket()函数创建套接字时,默认的套接字都是阻塞的。
一个套接字是阻塞的,那么它的 recv()、recvfrom()、WSARecv()和WSARecvfrom()、 send()、sendto()、WSASend()和WSASendto()、 accept()和WSAAcept()、 connect()和WSAConnect() 函数就是阻塞的. 
  一个套接字是非阻塞的,那么它的 recv()、recvfrom()、WSARecv()和WSARecvfrom()、 send()、sendto()、WSASend()和WSASendto()、 accept()和WSAAcept()、 connect()和WSAConnect() 函数 就是非阻塞的.
套接字模式与I/O模型的关系:
  套接字模式是定义一个SOCKET的行为方式.阻塞的SOCKET, 它在执行SEND时,发送不成功,SEND函数不会返回,程序也就不能向下执行. 非阻塞send, 成功不成功都返回,根据返回值来判断是否成功.如果不成功,你还要继续的调用.
  I/O模型是当你的程序中有多个SOCKET的话, 如何管理它们以让他们达到最高的工作效率.
   比如说wsasyncselect模型, 把一个socket和一个windows procedure联系起来,把这个socket设成非阻塞的,它send了一个数据返回了,即使他不成功,你也不用再来调用了,当它可以发送时,OS会给windows procedure发消息的. 如果你把它改成阻塞的了,那么你就失去了使用I/O模型的意义了.
<1>
SOCKET 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;
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、函数会立即完成并返回,无论套接字是否设为阻塞模式。此时这些函数就默认相当于非阻塞模式了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值