Socket.receive第二次返回0,但端口中有数据

时间:2012-12-27 14:34:13

标签: sockets

我正在编写服务器应用程序以使用vb.net套接字类接收请求和回答。我使用的是socket.receive,第一次没问题,但第二次总是返回0字节。我可以通过嗅探器看到端口中有数据。我可以看到,我们通过了通信的3个第一步,我可以看到端口中的数据,但我的socket.receive指令总是返回0个字节(有时它会在第一次和第二次停止时工作,但有时候自从第一次它返回0) 我发现了很多推荐但没有任何作用,例如:在socket.receive指令之前使用socket.available,将socket.receive置于一个循环中等待完整的消息,清除套接字缓冲区。 这是我的socket.receive指令代码的一部分:

Try
    While True
      If vConnectionSocket.Available > 0 Then
        vNumOfBytesReceived = vConnectionSocket.Receive(Data, 0, vMessageLength, SocketFlags.None)
        Array.Copy(Data, indbuf, vClientMessage, indbuf, vNumOfBytesReceived)

        If vStrMsg.IndexOf(ChrW(3)) > -1 Then
          Exit While
        End If
        Array.Clear(Data, 0, Data.Length)
      End If
    End While
Catch ex As SocketException
  If vConnectionSocket.Connected Then vConnectionSocket.Close()
    MessageBox.Show("Receiving error >" + ex.ErrorCode.ToString + ":" + ex.Message.ToString)   
  Exit Sub
End Try

我感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

Read the documentation

  

如果使用面向连接的Socket,Receive方法将读取尽可能多的数据,最多可达size参数指定的字节数。 如果远程主机使用Shutdown方法关闭Socket连接,并且已收到所有可用数据,则Receive方法将立即完成并返回零字节

换句话说,当Receive()返回0时,另一方关闭了连接。没有更多数据可供阅读。关闭连接的末尾。