0

vb.net ソケット クラスを使用してリクエストを受信し、応答するサーバー アプリケーションをプログラミングしています。私は socket.receive を使用していますが、1 回目は問題ありませんが、2 回目は常に 0 バイトを返します。ポートにデータがあることをスニファで確認できます。通信の最初の 3 つのステップを正常に通過したことがわかり、ポート内のデータを確認できますが、socket.receive 命令は常に 0 バイトを返します (1 回目と 2 回目は機能する場合がありますが、最初は 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

助けていただければ幸いです。

4

1 に答える 1

0

ドキュメントを読む

接続指向の Socket を使用している場合、Receive メソッドは、サイズ パラメーターで指定されたバイト数まで、使用可能なデータをすべて読み取ります。リモート ホストが Shutdown メソッドを使用して Socket 接続をシャットダウンし、使用可能なすべてのデータが受信された場合、Receive メソッドはすぐに完了し、ゼロ バイトを返します

つまり、Receive() が 0 を返した場合、接続は相手によって閉じられました。読み取り可能なデータはこれ以上ありません。接続の端を閉じます。

于 2012-12-27T21:52:52.650 に答える