Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如果客户端关闭了连接,套接字描述符会改变吗?_C_Linux_Sockets_Tcp - Fatal编程技术网

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

C 如果客户端关闭了连接,套接字描述符会改变吗?,c,linux,sockets,tcp,C,Linux,Sockets,Tcp,我们的服务器可以接受的传入连接数量有限。 由于各种原因,我们有多个客户端以不同的间隔连接到服务器 服务器的至少一个功能要求它处理客户机的请求并在同一套接字上回复。然而: 客户抱怨超时(我相信会关闭套接字) 服务器成功地完成了它的处理,但是线程抛出了一个SIGCHLD,因为套接字已经关闭 我有类似于下面的代码,用于检查套接字描述符 if (connect_desc > 0) { if (write(connect_desc, buffer, sizeof(buffer)) <

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

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

  • 客户抱怨超时(我相信会关闭套接字)
  • 服务器成功地完成了它的处理,但是线程抛出了一个SIGCHLD,因为套接字已经关闭
我有类似于下面的代码,用于检查套接字描述符

if (connect_desc > 0)
{
    if (write(connect_desc, buffer, sizeof(buffer)) < 0)
    {
        printf("write error\n");
    }
}
else
    printf("connect_desc < 0\n");
if(连接描述>0)
{
if(写入(连接描述、缓冲区、大小(缓冲区))<0)
{
printf(“写入错误\n”);
}
}
其他的
printf(“连接描述<0\n”);
我的问题是:

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

我看不到最后的打印件

问:描述符会改变吗

A:没有

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

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

强烈建议:

文件描述符会改变吗

除非:

  • 它被记录在你可以引用的地方
  • 操作系统神奇地知道断开连接的情况
  • 操作系统神奇地知道FD在应用程序中的存储位置,包括所有副本
  • 操作系统想神奇地让你无法自己关闭插座
  • 这些都不是真的。这个问题根本没有意义

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


    根据设计,TCP连接的状态是不存在的。检测它是否失败的唯一方法是尝试使用它。

    谢谢!我一定会看一看链接,甚至可能会买这本书。我真的很感激你的回答,但请不要对此大惊小怪。我理解你的4点,但我发现我必须维护的应用程序中存在的问题让我感到困惑。我只是想确认一下我认为是正确的,然后再去找客户的开发人员,告诉他们这是他们这边的事情。LOL+1。我想我应该把它取下来。