当使用socket()函数和WSASocket()函数创建套接字时,默认的套接字都是阻塞的。
1 一个套接字是阻塞的,那么它的
recv()、recvfrom()、WSARecv()和WSARecvfrom()、
send()、sendto()、WSASend()和WSASendto()、
accept()和WSAAcept()、
connect()和WSAConnect()
函数就是阻塞的.
2
SOCKET
s
ioctlsocket(s,FIONBIO,1);//s被设置为非阻塞模式
send(s,buf,len,flags);//s被设为非阻塞模式后,直至再次把s设为阻塞前,其后续操作如send,recv等都是非阻塞的。
<2>
SOCKET
s
WSASend(s,buf,1,numberOfBytesSent,flag,overlapped,NULL);//在重叠套接字上的操作,如WSASend,WSARecv等,如果填写了overlapped结构作为参数,都是重叠IO操作的。同时,这些操作也是非阻塞的,不需要显式调用ioctlsocket。(另一个解释: 若随一个 WSAOVERLAPPED 结构一起调用这些函数,WSASend、WSASendTo、WSARecv、WSARecvFrom、WSAIoctl、AcceptEx、TrnasmitFile、函数会立即完成并返回,无论套接字是否设为阻塞模式。此时这些函数就默认相当于非阻塞模式了 )