
如何将socket设置成非阻塞的,非阻塞socket与阻塞的socket在收发数据上的区别
发布日期:2021-05-08 05:59:40
浏览次数:22
分类:精选文章
本文共 1098 字,大约阅读时间需要 3 分钟。
生成socket时设置
在生成socket时,默认情况下socket是阻塞的。此外,我们可以通过设置特定选项将socket设置为非阻塞模式。
非阻塞socket配置
可以通过以下方式将socket设置为非阻塞模式:
int s = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP);
使用fcntl设置
我们可以使用fcntl函数来设置socket的阻塞模式。
将socket设置为非阻塞
if ((nFlags = fcntl(nSock, F_GETFL, 0)) < 0) { return 0;}nFlags |= O_NONBLOCK;if (fcntl(nSock, F_SETFL, nFlags) < 0) { return 0;}
将socket设置为阻塞
if ((nFlags = fcntl(nSock, F_GETFL, 0)) < 0) { return 0;}nFlags &= ~O_NONBLOCK;if (fcntl(nSock, F_SETFL, nFlags) < 0) { return 0;}
非阻塞和阻塞在收发数据时的区别
TCP发送时的区别
TCP发送(即send函数)
- 阻塞模式下,send函数会等待所有数据都被拷贝到发送缓冲区才会返回。这意味着在阻塞模式下,send函数返回值必定等于参数中发送长度。
- 非阻塞模式下,send函数会立即返回,但它会尽可能多地拷贝数据到缓冲区。由于缓冲区可能已满,返回值可能小于发送长度。
UDP发送(即sendto函数)
- 即使在阻塞模式下,sendto函数也不会阻塞。UDP没有真正的发送缓冲区,它仅将应用缓冲区数据拷贝到协议栈,并不涉及阻塞。
- 非阻塞模式下,sendto函数的行为与阻塞模式下相同。
TCP接收时的区别
TCP接收(即recv函数)
- 阻塞模式下,recv函数会阻塞,直到缓冲区中有至少一个字节才会返回。如果没有数据到来,recv函数会一直阻塞或直到超时。
- 非阻塞模式下,recv函数不会阻塞。如果缓冲区中有任何一个字节,它会立即返回。如果没有数据,recv函数会返回错误WSAEWOULDBLOCK。
UDP接收(即recvfrom函数)
- 阻塞模式下,recvfrom函数会阻塞,直到缓冲区中有一个完整的UDP数据包才会返回。
- 非阻塞模式下,recvfrom函数会立即返回。如果缓冲区中有一个完整的数据包,它会返回数据包大小;如果没有数据,会返回错误WSAEWOULDBLOCK。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年03月24日 09时57分08秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Python 之网络式编程
2019-03-06
MySql5.5安装步骤及MySql_Front视图配置
2019-03-06
springmvc Controller详解
2019-03-06
mybatis #{}和${}区别
2019-03-06
Java Objects工具类重点方法使用
2019-03-06
Java内存模型(JMM)
2019-03-06
AQS相关
2019-03-06
abp(net core)+easyui+efcore实现仓储管理系统——多语言(十)
2019-03-06
WCF学习之旅—第三个示例之一(二十七)
2019-03-06
java ThreadPoolExecutor初探
2019-03-06
Markdown进阶
2019-03-06
快速指数算法
2019-03-06
python去除字符串中的特殊字符(爬虫存储数据时会遇到不能作为文件名的字符串)
2019-03-06
PHP将网址快捷方式保存到桌面
2019-03-06
SpringCloud微服务(03):Hystrix组件,实现服务熔断
2019-03-06
Spring 框架基础(01):核心组件总结,基础环境搭建
2019-03-06