2017-12-12 9 views
0

Ich habe gerade angefangen, mit dem UDPClient in .Net (Core 2) zu arbeiten. und bemerkte, dass es beim Empfang tatsächlich eine Ausnahme "remote hat geschlossene Verbindung" auslösen kann. Das macht für mich keinen Sinn, da UDP keine Fernbedienungen benötigt.Warum ist eine Remote-Verbindung geschlossen? Ausnahme für UDP-Sockets?

Ich empfange UDP-Daten von einer Anwendung, über die ich keine Kontrolle habe. Was ich kurz tun, ist dies:

if(MyUDPClient.Available > 0) 
{ 
    IPEndPoint Point = null; 
    Byte[] Data = MyUDPClient.Receive(ref point); 
    //[do something with data] 
} 

jedoch während der Laufzeit der Anwendung (während ich Daten empfangen, oben in einer Schleife durchgeführt), um den Anruf zu empfangen kann die Ausnahme werfen, dass die Fern die geschlossen Verbindung (was es nicht ...).

Kann jemand mir erklären, warum diese Ausnahme überhaupt eine Sache ist und vielleicht sogar ein Workaround? Alles, was ich will, ist Daten empfangen und identifizieren, von welchem ​​Endpunkt es originiert.

+0

Bitte geben Sie einen Mindestcode ein. Ohne zu sehen, wie Sie MyUDPClient initialisieren, können wir nur spekulieren, was das Problem ist. Möglicherweise haben Sie MyUDPClient mit dem Standardkonstruktor erstellt, was bedeutet, dass Sie den lokalen Port/lokalen Endpunkt nicht angegeben haben. Wenn dies der Fall ist, schlägt MyUDPClient.Available fehl, weil es nicht weiß, wo nach verfügbaren Daten gesucht werden soll. Aber du hast Recht, die Ausnahme, dass die Fernbedienung die Verbindung geschlossen hat, ist sehr irreführend. Es bedeutet wahrscheinlich nur, dass Ihr UDPClient nicht an einen lokalen Port gebunden ist. – Xaver

+0

Nach einigen Ausgrabungen wird dieser Fehler von UDP-Sockets ausgelöst, nachdem Sie versucht haben, Daten an einen Endpunkt zu senden, der den Socket geschlossen hat. Während Ihr UDPSocket möglicherweise einige Daten zu lesen hat, wird eine Ausnahme ausgelöst, da der letzte Sendevorgang nicht erfolgreich war. Ein Control-Flag erlaubt es, dies zu ignorieren. Ich werde eine Antwort hinzufügen. –

Antwort

0

Nachdem ich ein wenig tiefer hineingegangen bin, habe ich hier auf Stackoverflow eine weitere Antwort gefunden, die es erklärt. Source Answer
Kurz gesagt: Wenn ein UDPClient.Send fehlschlägt, weil die Fernbedienung ihren Socket geschlossen hat, löst der nächste Empfang (selbst wenn Daten vorhanden sind, deshalb verfügbar> 0) die Ausnahme aus. Es gibt ein Controlflag, das gesetzt werden kann, was es erlaubt, dies zu ignorieren. Schließlich ist mir die Fernbedienung egal, daher ist mir die "unerreichbare" Antwort der Remotemaschine egal.

var udpClient = new UdpClient(); 
uint IOC_IN = 0x80000000; 
uint IOC_VENDOR = 0x18000000; 
uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12; 
udpClient.Client.IOControl((int)SIO_UDP_CONNRESET, new byte[] { Convert.ToByte(false) }, null); 
Verwandte Themen