【问题标题】:Would the socket descriptor change if a client closed the connection?如果客户端关闭连接,套接字描述符会改变吗?
【发布时间】:2013-10-23 21:13:35
【问题描述】:

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

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

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

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

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

我的问题是:

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

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

【问题讨论】:

    标签: c linux sockets tcp


    【解决方案1】:

    问:描述符会改变吗?

    答:没有

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

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

    强烈推荐:

    【讨论】:

    • 谢谢!我一定会看一下链接,甚至可能会买这本书。
    【解决方案2】:

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

    除非:

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

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

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

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

    【讨论】:

    • 我非常感谢您的回答,但请不要对此嗤之以鼻。我了解您的 4 点,但我在应用程序中看到了我必须维护的问题,这让我感到困惑。在我去找客户的开发人员并告诉他们这是他们方面的事情之前,我只是想确认我认为是正确的。
    • 大声笑+1。我想我应该删除它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2011-03-31
    • 1970-01-01
    • 2015-02-08
    • 2012-04-23
    相关资源
    最近更新 更多