Chinaunix

标题: epool LT模式对端close 本端recv不到0 [打印本页]

作者: kdkgod    时间: 2013-02-28 09:37
标题: epool LT模式对端close 本端recv不到0
epoll LT模式,只有EPOLLIN的时候对端close,epoll_wait会recv 0,但是EPOLLIN|EPOLLOUT的时候对端close本端却收不到0,而是recv -1, strerror(errno):Connection reset by peer。

废话少说,直接上代码。还望高手指点! 3Q

epoll.tar.gz (4.38 KB, 下载次数: 6)


作者: sonicling    时间: 2013-02-28 10:15
设置成阻塞才会有0
作者: zimang    时间: 2013-02-28 10:44
回复 2# sonicling


    Are you sure?
作者: kdkgod    时间: 2013-02-28 11:13
貌似不行哦。你看看我的源码,很简单的。将其设置为非阻塞也不行。recv -1 回复 2# sonicling


   
作者: linux_c_py_php    时间: 2013-02-28 11:13
可能是对端FIN了, 你还写, 对端给RST了, 这边的协议栈就知道peer close了, 于是Read也会通知你失败了.

这些都是正常现象, 出错和读0都要关闭连接, 有什么区别.
作者: linux_c_py_php    时间: 2013-02-28 11:18
不过楼主的代码我看了, 是不可用的错误代码,

1, ET模式, 你却当LT来读, 注定会把连接挂起.
2, 写数据,  你却想当然的以为数据可以完全写出去, 你还需要学学write的返回值的概念.
作者: kdkgod    时间: 2013-02-28 11:19
你说的有点道理,但是为什么ET模式下就可以recv 0呢。 并且LT模式下如果有EPOLLOUT的时候send也没有失败。。。。。回复 5# linux_c_py_php


   
作者: kdkgod    时间: 2013-02-28 11:24
百思不得其解的就是LT模式下,EPOLLIN和EPOLLOUT同时存在对端close的时候recv为什么为-1。正常应该为0才对。回复 6# linux_c_py_php


   
作者: linux_c_py_php    时间: 2013-02-28 11:28
linux_c_py_php 发表于 2013-02-28 11:18
不过楼主的代码我看了, 是不可用的错误代码,

1, ET模式, 你却当LT来读, 注定会把连接挂起.


你代码已经写错了, 先改成正确的.




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2