recv()套接字函数返回长度为0的数据

ckv*_*ckv 18 c sockets tcp

我有一个应用程序,它在端口号5005上与另一个设备(带有Web服务器的硬件设备)建立了套接字连接.

现在,如果我的硬件设备断开连接,那么我将断开与设备的连接.

  1. 这是否意味着我现在使用的套接字变为无效.

  2. 发生此断开连接时,是否会收到任何特殊消息,如空字符或其他内容.

  3. 如果我的套接字连接变得无效,那么为什么recv()套接字函数不会抛出和SOCKET_ERROR.相反,为什么我会收到0长度的数据.

谢谢

Rob*_*nes 35

recv返回值为0,这意味着在连接已被关闭.

请参见recv手册页:

这些调用返回接收的字节数,如果发生错误则返回-1.当对等体执行有序关闭时,返回值将为0.

在回答问题#1时,是套接字现在无效.您必须创建新的套接字和连接以进行进一步的通信.

编辑

现在正如valdo在下面指出的那样,也有可能有一个半封闭的TCP连接,你不能再接收它,但你可以继续写入套接字,直到你完成数据发送.有关更多详细信息,请参阅此文章: TCP Half-Close.听起来不像你有这种情况.

在回答问题#2时,基本上有两种方法来检测闭合的套接字.这假设套接字经历了有序关闭,这意味着对等体称为shutdown或者close.

第一种方法是从套接字读取,在这种情况下,返回值为0.另一种方法是写入套接字,这将导致抛出SIG_PIPE信号,指示管道损坏.

为了避免信号,您可以设置MSG_NOSIGNAL套接字选项,在这种情况下send返回-1并设置errnoEPIPE.

  • @ckv实际上还有一个`recv()`返回零的可能性.当接收的字节大小为零时,它会这样做.我只是偶尔走过这些耙子 - 很长一段时间都弄不清楚,为什么插座没问题,但我一直都是零☺ (3认同)

val*_*ldo 10

同意Robert S. Barnes.除了声称套接字现在"无效".

它仍然有效.你可以使用它.您甚至可以将数据发送给对等方.你唯一不能做的就是打电话recv.

  • +1 是的,我忘记了半关闭的可能性。我会更新我的答案。 (2认同)