Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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_Sockets_Io - Fatal编程技术网

C 检测非阻塞插座上的闭合连接

C 检测非阻塞插座上的闭合连接,c,sockets,io,C,Sockets,Io,如果我的问题是重复的,我真的很抱歉,但是我在网站上没有找到有用的信息 我使用的是非阻塞套接字和select()。如何检测客户端是否关闭了非阻塞套接字上的连接?我看到read()在没有可读取的数据以及连接关闭时返回-1,errno=ewoldblock 如何区分上述情况?当对等方关闭特定套接字的连接时,在此套接字上调用将返回0。此行为独立于套接字的阻塞状态 摘自(我用斜体): 返回值 成功时,返回读取的字节数(零表示文件结束) 对等方关闭连接时: select()将返回可读的套接字 套接字上的re

如果我的问题是重复的,我真的很抱歉,但是我在网站上没有找到有用的信息

我使用的是非阻塞套接字和select()。如何检测客户端是否关闭了非阻塞套接字上的连接?我看到read()在没有可读取的数据以及连接关闭时返回-1,errno=ewoldblock


如何区分上述情况?

当对等方关闭特定套接字的连接时,在此套接字上调用将返回
0
。此行为独立于套接字的阻塞状态

摘自(我用斜体):

返回值

成功时,返回读取的字节数(零表示文件结束)


对等方关闭连接时:

  • select()
    将返回可读的套接字
  • 套接字上的
    recv()
    read()
    将返回零
  • 我看到read()在没有可读取的数据时返回-1,errno=ewoldblock

    正确,但连接未关闭

    以及当连接关闭时

    不,你没有。那是不对的。它返回零

    我如何区分上述情况


    它们是不同的,它们的表现方式也不一样。

    你说得对!我刚刚制作了一个玩具客户端-服务器应用程序,它就像你和alk解释的那样工作。在我的原始应用程序中,我从浏览器收集连接,我看到创建了一个线程来从服务器获取每个图像。当线程获得映像时,它是否可能不关闭套接字/连接?是的,这就是HTTP保持活动的效果。但是,如果你正在发送,你不必担心接收时会发生什么。当你发送图像时,只需关闭套接字。NoPE,我的应用程序位于服务器端和客户端之间。它的工作原理类似于转发器,也就是说,它必须收集从一端到达的数据,然后将它们转发到另一端。我的转发器应用程序应该能够检测客户端何时关闭连接,因为我需要关闭无用的套接字和无用的线程(我的意思是,完成任务的线程)。因此,如果使用HTTP keep alive,是否无法检测线程作业的结束?解决方案:在持久连接中,经过一定时间后,read()返回0,因此可以检测关闭的连接。@LucaForte“经过一定时间”与此无关
    read()
    当对等方关闭连接时返回零,可能是在一秒钟、一年或一个世纪之后。任何调用都返回零。如果第一次调用返回零,则表示对等端关闭而不发送任何内容的异常情况。一旦0被退回,它将继续被退回。删除三振。没有人会在意以前的错误,如果他们在意,他们会出现在编辑历史记录中。@EJP:谢谢,我只是把它放在里面以避免出现悬而未决的评论。:-)让我们来整理一下评论。。。