select低级错误
来源:互联网 发布:企业淘宝开店流程 编辑:程序博客网 时间:2024/05/22 01:50
本来不想吐槽的了,但是想到会有很多初学者犯了我所犯过的低级错误,找bug找了一天都找不到,还是决定写写这个比较隐性的错误把。(ps:本人菜鸟一枚)
如下典型的select多路复用套接口代码
fd_set rset; int socket_one, socket_two, maxfd; /* 一些列的初始化代码 */ maxfd = socket_one > socket_two ? socket_one: socket_two; FD_ZERO(&rset); FD_SET(socket_one, &rset); FD_SET(socket_two, &rset); while(1){ select(maxfd + 1, &rset, NULL, NULL, NULL); if(FD_ISSET(socket_one, &rset)){ /* 代码*/ } if(FD_ISSET(socket_two, &rset)){ /*代码*/ } }一眼看上去似乎没有么多大的问题,但是把程序编译跑起来之后(假如你预计select第一次返回,socket_one可读,select第二次返回socket_two可读),情况并不如你所想。第二次当socket_two可读的时候,程序根本就不去读socket_two套接口!
出现这个隐性bug的原因在于select第一次返回的时候,只有socket_two在rset集合里面。因此当程序再次select的时候,相当于
FD_ZERO(&rset); FD_SET(socket_one, &rset); select(maxfd + 1, &rset, NULL, NULL, NULL);也就是说第二次的select只是检测socket_one是否可读,socket_two是否可读已经不能检测到!正确的代码应该如下:
fd_set rset, allset;/*添加一个allset的变量,存储所有想要检查的套接口*/ int socket_one, socket_two, maxfd; /* 一些列的初始化代码 */ maxfd = socket_one > socket_two ? socket_one: socket_two; FD_ZERO(&allset); FD_SET(socket_one, &allset); FD_SET(socket_two, &allset); while(1){ rset = allset;/*每次循环都应恢复,这一步是最关键的*/ select(maxfd + 1, &rset, NULL, NULL, NULL); if(FD_ISSET(socket_one, &rset)){ /* 代码*/ } if(FD_ISSET(socket_two, &rset)){ /*代码*/ } }
- select低级错误
- 低级错误
- 低级错误
- 低级错误!
- 低级错误
- 低级错误
- 低级错误
- 低级错误
- 比较低级的错误
- CSDN-低级错误
- 北青网也会犯低级错误!
- android 之低级错误
- hibernate 低级错误
- 低级错误最可怕
- MySql设置 低级错误!!
- 一个低级错误
- 丢人的低级错误
- 犯了低级错误
- SQL触发器实例讲解
- 补码-自己的理解
- js的直接显示在页面
- MFC 如何添加位图按钮
- 游戏框架设计
- select低级错误
- java程序中加入@SuppressWarnings("serial")是什么意思?
- 黑马程序员_Map集合学习笔记
- std::vector 两种操作的比较
- 宏和枚举的区别
- PC电脑和Android模拟器访问及模拟器之间tcp/udp通信
- asp.net menu控件的那个黑色小三角箭头怎么去掉?
- Java开发中的23种设计模式详解
- outlook2007提示禁止访问下列具有潜在不安全因素的附件,如何解决