is68 发表于 2016-05-21 17:10

socket的问题

用epoll做了一个服务器,客户端连接接,epoll收到新连接后,有时候马上有EPOLLIN事件,但是read返回0,这是哪里出问题了?
好像是客户端执行了close后,再连接,就可能会出现。 只要一出现,每次客户端连接,就是出现上面的问题。
跟踪数据发现,断开的客户端连接描述符和新连接的描述符相同。

is68 发表于 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).

linux_c_py_php 发表于 2016-05-23 11:44

read=0标识对方FIN了,你可以close掉这个连接。

VIP_fuck 发表于 2016-05-23 16:50

嘿,楼主应该仔细看看 unix网络编程 那本书,这个问题基本上就是收到fin了。

这个跟虚拟机关系不大

is68 发表于 2016-05-24 15:36

那为什么会在收到客户端连接后,又收到这个连接的FIN呢?

is68 发表于 2016-05-24 16:01

回复 4# VIP_fuck


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

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

VIP_fuck 发表于 2016-05-24 16:38

本帖最后由 VIP_fuck 于 2016-05-24 16:40 编辑

回复 6# is68


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

魔鬼的惊叹 发表于 2016-06-06 19:52

回复 7# VIP_fuck

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



   
页: [1]
查看完整版本: socket的问题