
socket函数创建socket默认是阻塞的,也可以增加选项将socket设置为非阻塞的:
int s = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP);
if ((nFlags = fcntl (nSock, F_GETFL, 0)) < 0)
return 0;
nFlags = nFlags | O_NONBLOCK;
if (fcntl (nSock, F_SETFL, nFlags) < 0)
return 0;
if ((nFlags = fcntl (nSock, F_GETFL, 0)) < 0)
return 0;
nFlags = nFlags & (~O_NONBLOCK);
if (fcntl (nSock, F_SETFL, nFlags) < 0)
return 0;
即使在阻塞模式下,sendto也不会阻塞,因为UDP并没有真正的发送缓冲区,它所做的只是将应用缓冲区数据拷贝给下层协议栈,加上UDP头、IP头等,实际是不存在阻塞的,非阻塞模式也一样。
