0

小さなデータグラムを別のクライアントに送受信する UdpClient があります。を使用して、ソケットのバッファから一度に 1 つのデータグラムを取得しようとしています。

udpClient.Client.Receive(byte[] buffer, int offset, int size, SocketFlags socketFlags);

私は2つの問題を抱えています。最初の問題は、受信時に、ソケットから取得できるバイト数よりも 1 バイト少ない値を取得していて、SocketException が発生することです。

データグラム ソケットで送信されたメッセージが、内部メッセージ バッファまたはその他のネットワーク制限よりも大きかったか、データグラムを受信するために使用されたバッファがデータグラム自体よりも小さかった

これは、(利用可能な 7 バイトのうち 6 バイトをプルしようとしている) 場合です。

Client.Available = 7
buffer = byte[1024]
offset = 0
size = 6
socketFlags = SocketFlags.None

基礎となるソケット バッファ サイズは、8k などの大きなものです。size=Client.Available に設定すると、このエラーが発生しないことがわかりました。なんらかの理由で、ソケットから 7 バイトのうち 6 バイトだけを取り出そうとしているのが気に入りません。

これを回避するために、オーバーロードを使用しました

udpClient.Client.Receive(byte[] buffer, int offset, int size, SocketFlags socketFlags, out SocketError socketError);

「エラー」を無視しました。これにより、7 バイトのうち 6 バイトを受信できました。

しかし、これは次の 2 番目の問題に取って代わられました。

ソケットで使用可能な 7 バイトのうち 6 バイトをプルすると、バッファがフラッシュし、Socket.Available = 0 になります。私を困惑させるのは、このコードがおそらく 6 か月前に動作していたのに、別のマシンで動作していたことです。私はいくつかの読書をしました.SocketExceptionはOSがソケットにアクセスすることによって引き起こされる可能性があると思いますが、当時も現在もWindows 7 64ビットを使用していました。誰かがこのような問題を経験したことがありますか、または主題に光を当てるための知識を持っているかもしれませんか? ご助力いただきありがとうございます!

4

1 に答える 1

1

データグラム全体を一度に読み取ることになっています。そうしないと、せいぜい残りが失われます。TCPのようなバイトストリームではありません。

于 2013-03-04T00:46:24.767 に答える