博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决在epoll中accept接收端口会漏处理的问题. 直到新的socket消息到达,epoll_wait才响应去接收socket端口数据的问题
阅读量:4041 次
发布时间:2019-05-24

本文共 1001 字,大约阅读时间需要 3 分钟。

在用epoll的边缘触发模式中,发现socket接收有异常,有时会出现新的socket连接到底,但是需要有新的数据到底时,epoll_wait才响应去接收数据这个问题。
原因分析:
epoll的边缘触发模式下,同一端口可读时,epoll_wait只会提示一次。在accept中,当2个端口同时到达时,只会响应一次。这时就要用 while等循环函数去接收消息和接收accept响应,一般接收消息大家都会做,接收accept响应会忘。
代码修改:

老代码:

INT32 conn_fd = accept( listen_fd, (sockaddr *)&clientaddr, &clilen );//accept4( event_fd, (sockaddr *)&clientaddr, &clilen, SOCK_NONBLOCK )    if( conn_fd < 0 ) {        MS_LOGER_FATAL("%s%s%s%s", LOG_CMD_FLAG , LOG_VOD_FLAG , "accept error" , strerror( errno ));    } else {        MS_LOGER_DEBUG("%s%s%s%d", LOG_CMD_FLAG , LOG_VOD_FLAG , "conn fd" , conn_fd);    }
新代码:
while (1)     {        INT32 conn_fd = accept( listen_fd, (sockaddr *)&clientaddr, &clilen );//accept4( event_fd, (sockaddr *)&clientaddr, &clilen, SOCK_NONBLOCK )        if( conn_fd < 0 ) {            break;        } else {            MS_LOGER_DEBUG("%s%s%s%d", LOG_CMD_FLAG , LOG_VOD_FLAG , "conn fd" , conn_fd);	}    }
新代码会循环接收accept的端口中新到的socket,而老的代码,若accept中有多个端口时,只处理一个,其他未处理的端口要等该端口有新数据到底才会响应。

转载地址:http://uvldi.baihongyu.com/

你可能感兴趣的文章
drwtsn32.exe和adplus.vbs进行dump文件抓取
查看>>
cppcheck c++静态代码检查
查看>>
在C++中使用Lua
查看>>
一些socket的编程经验
查看>>
socket编程中select的使用
查看>>
关于AIS编码解码的两个小问题
查看>>
GitHub 万星推荐:黑客成长技术清单
查看>>
可以在线C++编译的工具站点
查看>>
关于无人驾驶的过去、现在以及未来,看这篇文章就够了!
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
为什么读了很多书,却学不到什么东西?
查看>>
长文干货:如何轻松应对工作中最棘手的13种场景?
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
No.147 - LeetCode1108
查看>>
No.174 - LeetCode1305 - 合并两个搜索树
查看>>
No.175 - LeetCode1306
查看>>
No.176 - LeetCode1309
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
mysql:sql alter database修改数据库字符集
查看>>
mysql:sql truncate (清除表数据)
查看>>