为什么此TCP连接的一个端点发送带有RST标志的数据包?

时间:2015-07-08 18:27:28

标签: sockets networking tcp

我正在编写试图执行以下操作的应用程序:

  1. 创建侦听可用端口的TCP服务器
  2. 创建连接到服务器的TCP套接字
  3. 让服务器套接字将数据写入客户端
  4. 使服务器套接字关闭其连接的结尾
  5. 让客户端向服务器写入消息
  6. 这就是问题所在。当我尝试运行应用程序时,TCP交换如下:

    前三个数据包建立three-way handshake,第四个和第五个数据包是服务器写入的数据及其确认的传输。

    正如预期的那样,服务器套接字发送一个设置了FIN标志的数据包,表明它正在关闭它的连接结束。客户端确认这一点,然后尝试将其数据写入套接字。服务器立即发送RST数据包,过早终止连接。

    为什么会这样?

    注意:上述捕获是在Windows 8.1上完成的。

2 个答案:

答案 0 :(得分:1)

发件人无法在[FIN]后发送数据。这样的动作将导致接收者发出[RST]。

答案 1 :(得分:1)

FIN可能表示服务器已完全关闭两个方向的连接。在这种情况下,如果它在连接上接收到任何进一步的数据,它将发出RST。这表明您的应用程序协议错误。如果服务器发送回复然后关闭套接字,则客户端无法通过该连接发送任何其他内容。

可能您需要服务器使用shutdown()调用SHUT_WR,然后在关闭套接字之前从客户端读取其他内容。或者你可能只是做错了。