关于connection reset by peer问题

来源:互联网 发布:网络谣传 编辑:程序博客网 时间:2024/04/29 17:37

今天在验证UNP(v3)第五章中的5.12例子。例子是这样的:一个回射服务器,一个客户端。客户端从终端接收输入,然后发给服务器。服务器只是简单的把字符串返回给客户端。然后客户端再显示到终端。书上让我们这样做:服务器和客户端正常连接后,把服务端子进程kill掉,这样的话,服务端会发送一个Fin包到客户端,而客户端收到这个Fin包后立即响应Ack包。但是客户端此时正阻塞在fgets上面。接着,我们随便输入个字符串,客户端就打出个信息"server terminated prematurely"。这些都好理解。问题在书上的几行小字。小字说:“上述讨论还取决于本例子的时序。客户调用readline既可能发生在服务器的RST被客户收到之前,也可能发生在收到之后。如果readline发生在收到RST之前,那么客户得到一个EOF,就得到"server terminated prematurely";否则结果是由readline返回一个ECONNRESET”。


但是我在Red Hat Enterprise Linux Server release 5.4上没有看到后一种情况出现。也就是说不管readline在收到RST之前还是之后,客户端的readline始终返回0。我的做法是在客户端的write和readline之前sleep一下。客户端write时,马上会收到一个RST,然后接着readline发现还是返回0。按书上的说法,这应该返回ECONNRESET错误的。不知道这是不是和内核有关。

原创粉丝点击