当前位置: 首页 > news >正文

网络编程中非阻塞的实现方式

一.设置套接字

1. fcntl
//文件从阻塞设置为非阻塞
int flag = fcntl(cfd, F_GETFL, 0);
flag |= O_NONBLOCK;
fcntl(cfd, F_SETFL, flag);
//文件从非阻塞设置为阻塞
int flags=fcntl(cfd, F_GETFL, 0);
flags &=~O_NONBLOCK;
fcntl(cfd, F_SETFL, flags);
2. socket
socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP);//SOCK_NONBLOCK非阻塞模式
3. ioctl
int main() {int sockfd;int nb = 1;  // 1表示启用非阻塞模式// 创建一个IPv4 TCP套接字sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket() failed");return 1;}// 设置套接字为非阻塞模式if (ioctl(sockfd, FIONBIO, &nb) < 0) {perror("ioctl() failed");return 1;}// 进一步的套接字操作...close(sockfd);return 0;
}
fcntl与ioctl的区别是什么?

ioctl():
ioctl() 是一个更底层的系统调用,适用于设备文件或套接字操作,在一些操作系统或设备驱动中使用时,它可以执行不同的控制操作,更多用于硬件设备控制。

fcntl():
fcntl() 是 POSIX 标准的一部分,广泛支持在不同的操作系统上,特别是对于文件描述符和套接字,它不涉及设备控制,仅用于操作文件描述符。

二.异步IO

fd = open(filename, O_RDWR | O_NONBLOCK);

三.设置超时

非阻塞接收数据
ssize_t NonBlockRecv(void* buf,size_t len)  //非阻塞的接收数据{return Recv(buf,len,MSG_DONTWAIT);   //MSG_DONTWAIT表示当前接收为非阻塞}
非阻塞发送数据
    ssize_t NonBlockSend(void* buf,size_t len)  //非阻塞的发送数据{if (len == 0) return 0;return Send(buf,len,MSG_DONTWAIT);   //MSG_DONTWAIT表示当前发送为非阻塞}

http://www.mrgr.cn/news/69617.html

相关文章:

  • RabbitMQ集群搭建
  • 优惠券秒杀的背后原理
  • JavaScript高级程序设计基础(四)
  • 生成式模型api国际选择
  • Python---re模块(正则表达式)
  • Mybatis Plus 集成 PgSQL 指南
  • 540. 有序数组中的单一元素
  • SimpleMemory 博客园主题美化
  • 如何自己实现事件的订阅和发布呢?
  • 基于SpringBoot+Vue音乐播放和推荐系统【提供源码+答辩PPT+参考文档+项目部署】
  • PostgreSQL 用户登录失败账号锁定
  • 基于SpringBoot的“生鲜交易系统”的设计与实现(源码+数据库+文档+PPT)
  • numpy np.logical_not函数介绍
  • LLMs在供应链投毒检测中的应用
  • Python中的动态属性管理:使用`__getattr__`和`__setattr__`实现灵活的数据访问
  • 文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于数据-模型混合驱动方法的多类型移动应急资源优化调度策略 》
  • 一文带你看懂Java多线程并发,深度剖析AQS源码
  • 想让水凝胶像智能生物一样行动?光和电怎样赋予其自主 “超能力”?
  • 基于PyQt Python的深度学习图像处理界面开发(一)
  • 【含开题报告+文档+PPT+源码】基于Springboot和vue的电影售票系统
  • 政务培训|LLM大模型在政府/公共卫生系统的应用
  • stm32以太网接口:MII和RMII
  • 前端 性能优化 (图片与样式篇)
  • 【GESP】C++一级真题练习(202312)luogu-B3921,小杨的考试
  • 用 Python 进行建模优化:Pyomo
  • KALI-sqlmap更新