簡體   English   中英

如何從C#udp套接字異常中優雅地恢復

[英]How to recover gracefully from a C# udp socket exception

上下文:我正在將一個Linux perl應用程序移植到C#,服務器偵聽一個udp端口,並通過一個udp套接字維護與遠程客戶端的多個並發對話框。 在測試期間,我向udp服務器發送大量數據包,隨機重啟客戶端以觀察服務器注冊新連接。 問題是這樣的:當我殺死一個udp客戶端時,服務器上可能仍然存在發往該客戶端的數據。 當服務器嘗試發送此數據時,它會返回icmp“無服務可用”消息,因此套接字上發生異常。

我無法重用此套接字,當我嘗試將C#異步處理程序與套接字關聯時,它會抱怨異常,因此我必須關閉並重新打開服務器端口上的udp套接字。 這是解決這個問題的唯一方法嗎?肯定有一些“修復”udp套接字的方法,從技術上講,UDP套接字不應該知道遠程套接字的狀態?

任何幫助或指針將不勝感激。 謝謝。

我認為你說得對:'服務器不應該知道'。 如果您將UDP數據包發送到可能打開或未打開的某個IP /端口,則無法知道服務器是否到達目的地。

服務器知道的唯一方法是讓客戶端發回ACK。 (在丟失包的情況下,客戶端和服務器都必須具有重新發送機制)。

很明顯,你的代碼中正在發生其他事情(或者使用.Net udp實現)

編輯:

在尼古拉的評論之后,我檢查了文檔。 事實上,在使用UDP時,.Net與“連接”或“無連接”有所區別。

如果你使用這樣的代碼:

UdpClient udpClient = new UdpClient(11000); //sourceport
try{
     udpClient.Connect("www.contoso.com", 11000); //'connect' to destmachine and port
     // Sends a message to the host to which you have connected.
     Byte[] sendBytes = Encoding.ASCII.GetBytes("Is anybody there?");
     udpClient.Send(sendBytes, sendBytes.Length);

然后顯然你是'連接'

但是,如果您使用這樣的代碼:

     UdpClient udpClientB = new UdpClient();
     udpClientB.Send(sendBytes, sendBytes.Length, "AlternateHostMachineName", 11000);

那么你可以發送給你選擇的任何人,而無需“連接”。

我不確定你的代碼是什么樣的,但是檢查你是否正在使用不假設“連接”的正確命令集可能是值得的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM