其他分享
首页 > 其他分享> > 如何将socket设置成非阻塞的,非阻塞socket与阻塞的socket在收发数据上的区别

如何将socket设置成非阻塞的,非阻塞socket与阻塞的socket在收发数据上的区别

作者:互联网

1. 生成socket时设置

socket函数创建socket默认是阻塞的,也可以增加选项将socket设置为非阻塞的:

int s = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP);

2. 使用fcntl设置

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;

3. 非阻塞和阻塞在收发数据时有什么区别

3.1 发送时的区别

3.1.1 TCP发送(即send函数)

3.1.2 UDP发送(即sendto函数)

即使在阻塞模式下,sendto也不会阻塞,因为UDP并没有真正的发送缓冲区,它所做的只是将应用缓冲区数据拷贝给下层协议栈,加上UDP头、IP头等,实际是不存在阻塞的,非阻塞模式也一样。

3.2 接收时的区别

3.2.1 TCP接收(即recv函数)

3.2.2 UDP接收(即recvfrom函数)

 

标签:返回,socket,成非,阻塞,nFlags,缓冲区,函数
来源: https://blog.51cto.com/u_14438799/2887220