首页 文章

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

提问于
浏览
0

我正在编写一个服务器应用程序来接收请求并使用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

    Read the documentation

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

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

相关问题