如果客户端关闭连接,套接字描述符会改变吗?

时间:2013-10-23 21:13:35

标签: c linux sockets tcp

我们有一台服务器,它可以接受的传入连接数量有限。 由于各种不同的原因,我们有多个客户端以不同的间隔连接到服务器。

服务器的至少一个功能要求它处理客户端的请求并在同一个套接字上回复。但是:

  • 客户抱怨超时(我相信关闭套接字)
  • 服务器成功完成处理,但是线程抛出SIGCHLD,因为套接字已经关闭。

我有类似下面的代码,它检查套接字描述符。

if (connect_desc > 0)
{
    if (write(connect_desc, buffer, sizeof(buffer)) < 0)
    {
        printf("write error\n");
    }
}
else
    printf("connect_desc < 0\n");

我的问题是:

如果客户端关闭套接字,套接字描述符是否会在服务器上更改值?如果没有,有没有办法在我的代码中捕获它?

我没看到最后一次打印出来。

2 个答案:

答案 0 :(得分:2)

  

问:描述符会改变吗?

答:没有

  

问:如何查看我的连接状态?

答:一种方法是尝试写入套接字,并检查错误状态。

强烈推荐:

答案 1 :(得分:0)

  

Q值。文件描述符会改变吗?

除非:

  1. 在某处你可以引用它。
  2. 操作系统神奇地知道断开连接。
  3. 操作系统神奇地知道应用程序在FD中的存储位置,包括所有副本。
  4. 操作系统想要神奇地让你自己无法关闭插座。
  5. 这些都不是真的。这个问题甚至没有意义。

      

    Q值。如何查看连接状态。

    在设计上,没有任何诸如TCP连接状态之类的东西。您可以通过尝试使用来检测它是否失败的唯一方法。