每當我的服務器應用程序收到一個對緩衝區來說太大的數據包時,它在調用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();爲什麼要叫它?我如何檢查接收到的消息對於緩衝區是否太大?
謝謝。但是,如果沒有其他防止崩潰的方法,我只想抓住這個例外。 – haiyyu 2012-02-12 14:32:55
處理它的唯一方法是捕捉異常。這樣做沒有任何問題。這是一個可持續的錯誤。只需在該調用周圍嘗試{...} catch(SocketException e){}即可。 – rasmus 2012-02-12 15:35:50
好的,謝謝。那就是我會做的。 – haiyyu 2012-02-12 16:35:56