2010-12-31 2 views
1

Ich bin das Senden von Daten an UDP-Socket mit diesem CodeC# UDP Socket die Zeit nehmen, Daten an unbekannten IP senden

Socket udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse(obj.destAddress), obj.destPort); 

byte[] buf = new byte[obj.length]; 
Array.Copy((byte[])obj.data, buf, obj.length); 
int n = udpClient.SendTo(buf, ipEndPoint); 
udpClient.Close(); 

dieser Code funktioniert gut, wenn IP in aktuellem Netzwerk vorhanden ist, aber es dauert 3-5 Sekunden, wenn Ich sende Daten an unbekannte IP-Adresse. Dies verursacht, dass die Hauptanwendung für 3-5 Sekunden hängen bleibt. Was könnte der Grund für dieses Problem sein.

+0

können Sie Ihr Netzwerk mit wireshark verfolgen, um festzustellen, wann arp-Anfragen gesendet werden? oder, Tracepath zu irgendeiner gelegentlichen IP? –

+0

tracert nimmt sich Zeit, wenn ich das IP gefragt habe ... Aber warum das passiert. Sucht UDP nach einer Route, bevor Daten an das Ziel gesendet werden? – Mohsan

Antwort

2

Ihr IP-Stack kann kein UDP-Paket senden, bis die MAC-Adresse bekannt ist. Das geschieht mit dem ARP-Protokoll. Der IP-Stack sendet eine ARP-Abfrage und wartet auf die ARP-Antwort. Wenn das SendTo fertig ist, kehrt es zurück.

Wenn Sie ein UDP-Paket an das Internet senden, ist die MAC-Adresse des Gateways erforderlich. Da das Gateway normalerweise verfügbar ist, wird das Zeitlimit nicht angezeigt, da Ihr IP-Stack unabhängig davon, ob das Ziel verfügbar ist oder nicht, zum Gateway senden konnte.

Sie können versuchen, eine Socket-Option für den asynchronen Betrieb festzulegen.

+0

Natürlich befindet sich die Gateway-Adresse normalerweise bereits im ARP-Cache, so dass keine Abfrage erforderlich wäre. –