2012-02-12 40 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的「緩衝區」變量只包含消息的前64個字節(如果它比這個大)。因此,檢查「緩衝區」是否包含多於64個字節不是一個選項。

所以我的問題是:

我需要調用EndReceiveFrom();爲什麼要叫它?我如何檢查接收到的消息對於緩衝區是否太大?

回答

2

From MSDN:

在回調方法,調用的IAsyncResult的AsyncState方法以獲得傳遞給BeginReceiveFrom方法的狀態對象。從此狀態對象中提取接收套接字。獲得Socket之後,可以調用EndReceiveFrom方法成功完成讀取操作並返回讀取的字節數。

因此,你應該在回調中調用EndReceiveFrom(和你一樣)。只需捕捉異常,您的應用程序就不會「崩潰」。

+0

謝謝。但是,如果沒有其他防止崩潰的方法,我只想抓住這個例外。 – haiyyu 2012-02-12 14:32:55

+1

處理它的唯一方法是捕捉異常。這樣做沒有任何問題。這是一個可持續的錯誤。只需在該調用周圍嘗試{...} catch(SocketException e){}即可。 – rasmus 2012-02-12 15:35:50

+0

好的,謝謝。那就是我會做的。 – haiyyu 2012-02-12 16:35:56