0

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

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

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

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

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

我的问题是:

如果客户端关闭了套接字,那么套接字描述符在服务器上的值会发生变化吗?如果没有,有没有办法在我的代码中捕捉到它?

我没有看到最后打印出来的。

4

2 回答 2

2

问:描述符会改变吗?

答:没有

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

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

强烈推荐:

于 2013-10-23T21:17:23.213 回答
0

问:文件描述符会改变吗?

除非:

  1. 它记录在您可以引用的某个地方。
  2. 操作系统神奇地知道断开连接。
  3. 操作系统神奇地知道 FD 在您的应用程序中存储的位置,包括所有副本。
  4. 操作系统想神奇地使您无法自己关闭套接字。

这些都不是真的。这个问题甚至没有意义。

问:如何检查我的连接状态。

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

于 2013-10-23T21:40:41.963 回答