2012-12-17 78 views
1

在Linux上我尝试以下步骤:为什么关机报告错误?

  1. 创建TCP套接字,并连接到任何HTTP服务器
  2. 发送HTTP请求数据
  3. 与SHUT_WR
  4. 关机写从套接字读取拿到HTTP响应
  5. 关机阅读SHUT_RD
  6. 关闭套接字

此错误发生在第5步,errno = ENOTCONN。当我在阅读EOF之后尝试关机写入时,同样的错误触及我。这是预期的吗?

+1

如果你得到EOF一边读书,连接必须是由服务器(TCP FIN在进行最后的块中的数据包)关闭。我不认为你真的需要完成第5步。 –

+0

是的,关闭读取是不必要的,但如果我们这样做,它不会违反TCP协议。只是想知道为什么tcp栈声称错误? – skygragon

+0

因为连接已经结束。将它与线捕捉相关联,在第二次关闭(2)之前,你可能会看到'FIN'来自另一端。 –

回答

0

在步骤4,如果你环绕在的recv()或阅读(),直到它返回0,那么你已经消耗的插座接近的另一半。除了这次是由远端发起的。这可能解释了为什么第5步会返回一个错误 - 由于远程终端已关闭连接的那一侧,因此没有任何关闭。

在任何情况下,你不需要第5步,因为你在步骤6中的“关闭”将关闭TCP连接的其余部分关闭套接字,并关闭套接字文件描述符。这对于非持久性连接完全没有问题 -

相关问题