linux c/c++杂谈程序员每天写1000字

如何将socket设置成非阻塞的,非阻塞socket与阻塞的so

2019-06-25  本文已影响17人  cpp加油站

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函数)

本人在简书上写的内容均为本人原创,转载需经本人同意,欢迎转载分享,请注明出处。简书主页:https://www.jianshu.com/u/e8c7bb5e3257

上一篇下一篇

猜你喜欢

热点阅读