socket的问题
用epoll做了一个服务器,客户端连接接,epoll收到新连接后,有时候马上有EPOLLIN事件,但是read返回0,这是哪里出问题了?好像是客户端执行了close后,再连接,就可能会出现。 只要一出现,每次客户端连接,就是出现上面的问题。
跟踪数据发现,断开的客户端连接描述符和新连接的描述符相同。
本帖最后由 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). read=0标识对方FIN了,你可以close掉这个连接。 嘿,楼主应该仔细看看 unix网络编程 那本书,这个问题基本上就是收到fin了。
这个跟虚拟机关系不大 那为什么会在收到客户端连接后,又收到这个连接的FIN呢? 回复 4# VIP_fuck
不在虚拟机上,确实还是有这样的问题,怎么解决这种问题呢? 基础不行,看书来不及了{:qq21:}
情况是这样: 客户端连接,epoll_wait 的监听描述符收到事件,accept后,又收到一个EPOLLIN事件,处理程序读取数据,发现read返回值为0,关闭这个描述符。 这样客户就一直处于 一连接,又被断开的状态下了。 本帖最后由 VIP_fuck 于 2016-05-24 16:40 编辑
回复 6# is68
这个逻辑没错吧? read 返回 0,说明是数据读完了,那就断开了呗。 回复 7# VIP_fuck
在阻塞状态,read返回0只能说明收到了FIN,不能证明读完了。
页:
[1]