免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2738 | 回复: 7

[C++] socket的问题 [复制链接]

论坛徽章:
1
15-16赛季CBA联赛之八一
日期:2018-12-06 21:25:36
发表于 2016-05-21 17:10 |显示全部楼层
用epoll做了一个服务器,客户端连接接,epoll收到新连接后,有时候马上有EPOLLIN事件,但是read返回0,这是哪里出问题了?
好像是客户端执行了close后,再连接,就可能会出现。 只要一出现,每次客户端连接,就是出现上面的问题。
跟踪数据发现,断开的客户端连接描述符和新连接的描述符相同。

论坛徽章:
1
15-16赛季CBA联赛之八一
日期:2018-12-06 21:25:36
发表于 2016-05-21 20:21 |显示全部楼层
本帖最后由 is68 于 2016-05-21 20:22 编辑

又测试了一下,发现服务器收到客户端连接后,还会收到已经断开的客户端之前发的数据,而新的客户端发的数据反而不触发EPOLLIN事件。

后来想,可能是VirtualBox中网络用的是NAT端口转发模式的问题,换到实际的网络上,目前还没有发现这样的问题,不知道是不是这个原因。

顺便再问一上,大家有没有用VirtualBox装Ubuntu的,用桥接网卡模式,虚拟机启动不了,报错:
Failed to open/create the internal network 'HostInterfaceNetworking-Intel(R) 82579LM Gigabit Network Connection' (VERR_SUPDRV_COMPONENT_NOT_FOUND).

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
发表于 2016-05-23 11:44 |显示全部楼层
read=0标识对方FIN了,你可以close掉这个连接。

论坛徽章:
12
2015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之同曦
日期:2017-03-17 19:13:162016科比退役纪念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16赛季CBA联赛之福建
日期:2016-01-14 12:49:22程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:002015年亚洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役纪念章
日期:2018-04-10 16:20:18
发表于 2016-05-23 16:50 |显示全部楼层
嘿,楼主应该仔细看看 unix网络编程 那本书,这个问题基本上就是收到fin了。

这个跟虚拟机关系不大

论坛徽章:
1
15-16赛季CBA联赛之八一
日期:2018-12-06 21:25:36
发表于 2016-05-24 15:36 |显示全部楼层
那为什么会在收到客户端连接后,又收到这个连接的FIN呢?

论坛徽章:
1
15-16赛季CBA联赛之八一
日期:2018-12-06 21:25:36
发表于 2016-05-24 16:01 |显示全部楼层
回复 4# VIP_fuck


    不在虚拟机上,确实还是有这样的问题,怎么解决这种问题呢? 基础不行,看书来不及了

    情况是这样: 客户端连接,epoll_wait 的监听描述符收到事件,accept后,又收到一个EPOLLIN事件,处理程序读取数据,发现read返回值为0,关闭这个描述符。 这样客户就一直处于 一连接,又被断开的状态下了。

论坛徽章:
12
2015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之同曦
日期:2017-03-17 19:13:162016科比退役纪念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16赛季CBA联赛之福建
日期:2016-01-14 12:49:22程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:002015年亚洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役纪念章
日期:2018-04-10 16:20:18
发表于 2016-05-24 16:38 |显示全部楼层
本帖最后由 VIP_fuck 于 2016-05-24 16:40 编辑

回复 6# is68


    这个逻辑没错吧? read 返回 0,说明是数据读完了,那就断开了呗。

论坛徽章:
4
丑牛
日期:2014-01-11 15:11:12亥猪
日期:2014-12-15 22:19:092015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-03-13 19:45:11
发表于 2016-06-06 19:52 |显示全部楼层
回复 7# VIP_fuck

在阻塞状态,read返回0只能说明收到了FIN,不能证明读完了。



   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP