私のサーバアプリケーションがバッファに対して大きすぎるパケットを受信すると、Socket.EndReceiveFromを呼び出すときにクラッシュします。これは私のコードは次のようになります。バッファが小さすぎる場合は例外を防止しますか?
static EndPoint remote = new IPEndPoint(IPAddress.Any, 0);
static Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
static void Main(string[] args)
{
socket.Bind(new IPEndPoint(IPAddress.Any, 1234));
Receive();
Console.WriteLine("Receiving ...");
for (; ;) ;
}
static void Receive()
{
byte[] buffer = new byte[64];
socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remote, ReceiveFromCallback, buffer);
}
static void ReceiveFromCallback(IAsyncResult result)
{
EndPoint theRemote = new IPEndPoint(IPAddress.Any, 0);
byte[] buffer = (byte[])result.AsyncState;
// the following for loop is irrelevant for this question - it simply outputs the received data as hex numbers
for (int x = 0; x < 8; x++)
{
Console.Write(" ");
for (int y = 0; y < 8; y++)
{
string hex = Convert.ToString(buffer[(x * 8) + y], 16);
Console.Write((hex.Length == 1 ? "0" : "") + hex + " ");
}
Console.WriteLine();
}
// the following line of code crashes the application if the received message is larger than 64 bytes
socket.EndReceiveFrom(result, ref theRemote);
}
受信したパケットが64のバイトよりも大きい場合は、私のアプリケーションは、SocketExceptionがが次のことを言ってスロー:
データグラムソケットを超えていた送信されたメッセージ の内部データバッファまたは別のネットワークの制限が大きすぎるか、またはデータグラムを受信するために使用されたバッファ が小さすぎました。
これは元のメッセージテキストではありません。私はVisual Studioのドイツ語版で作業しているので、翻訳し直さなければなりませんでした。
ReceiveFromCallbackの "buffer"変数には、メッセージの最初の64バイトのみが含まれています。したがって、 "buffer"に64バイト以上が含まれているかどうかを確認することはオプションではありません。
は、だから私の質問は以下のとおりです。
私はEndReceiveFrom()を呼び出す必要があります。なぜそれは呼ばれるべきですか?受信したメッセージがバッファに対して大きすぎるかどうかを確認する方法はありますか?コールバックメソッド内
ありがとうございました。しかし、クラッシュを防止する他の方法がない場合、例外をキャッチしたいだけです。 – haiyyu
これを処理する唯一の方法は例外をキャッチすることです。これには何も問題はありません。それは継続可能なエラーです。呼び出しの周りにtry {...} catch(SocketException e){}を置くだけです。 – rasmus
よろしくお願いいたします。それが私がやることです。 – haiyyu