shutdown(2)系统调用对我不起作用;我不确定我做错了什么

时间:2011-08-02 09:17:52

标签: c networking unix

我正在尝试shutdown(2)系统调用。 根据手册,它做我想要的。 当我以下列方式在TCP服务器中调用它时:

shutdown(clntSocket, SHUT_RDWR)

然后客户端必须能够观察到TCP连接已关闭。 我想,这意味着客户必须能够注意到不能发送/接收更多数据。这是我无法证实的理论。

在此simple experiment中,我定义了TCP服务器和TCP客户端。服务器从客户端接收3个字节,然后调用shutdown(2)。客户端发送3个字节,然后再发送3个字节。两个发送操作都成功。第二次发送操作不应该失败吗?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

成功发送操作意味着数据排队等待发送。这并不意味着它实际上是发送或接收的。调用shutdown后,如果要确认另一端已完成其关闭过程的一部分,则可以调用read。一旦read返回零或错误,您就知道连接已关闭。

答案 1 :(得分:0)

当服务器使用SHUT_WR或SHUT_RDWR调用shutdown(2)时,将发送带有FIN标志的TCP数据包。 FIN表示发件人不会再发送任何数据。它没有说明接收数据的意图。

客户端无法知道服务器是否已调用SHUT_RD。它似乎不会以任何方式影响客户。