2012-02-12 4 views
1

私のサーバアプリケーションがバッファに対して大きすぎるパケットを受信すると、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()を呼び出す必要があります。なぜそれは呼ばれるべきですか?受信したメッセージがバッファに対して大きすぎるかどうかを確認する方法はありますか?コールバックメソッド内

答えて

2

From MSDN:

、BeginReceiveFromメソッドに渡された状態オブジェクトを取得したIAsyncResultのAsyncStateメソッドを呼び出します。この状態オブジェクトから受信ソケットを抽出します。 Socketを取得したら、EndReceiveFromメソッドを呼び出して、読み取り操作を正常に完了し、読み取られたバイト数を返します。

したがって、(あなたのように)コールバックでEndReceiveFromを呼び出す必要があります。単に例外をキャッチして、アプリケーションは "クラッシュ"しません。

+0

ありがとうございました。しかし、クラッシュを防止する他の方法がない場合、例外をキャッチしたいだけです。 – haiyyu

+1

これを処理する唯一の方法は例外をキャッチすることです。これには何も問題はありません。それは継続可能なエラーです。呼び出しの周りにtry {...} catch(SocketException e){}を置くだけです。 – rasmus

+0

よろしくお願いいたします。それが私がやることです。 – haiyyu

関連する問題