2016-09-06 2 views
0

Ich versuche zu senden und empfangen zu/von einer UDP Multicast-Adresse mit UWP. Es funktioniert perfekt die ersten Male, aber nach einer Weile dieses Sende-Empfangs-Prozesses, wird es auf dem empfangenden Teil sperren. Ich wechselte von einem asynchronen Ansatz zu einem synchronen, aber immer noch dem gleichen. Selbst wenn ich einen neuen UDP-Client instanziiere, wird der Port blockiert, bis die App neu gestartet wird. Was mache ich falsch?UDP-Client nach mehreren senden/empfangen stoppt empfangen und blockiert Port

private UdpClient udp; 
//inside main function: 
if (udp == null) 
     { 
      udp = new UdpClient(new IPEndPoint(IPAddress.Any, portNumber)); 
      //^the second time this is called, it will complain about port reuse 
      udp.Client.ReceiveTimeout = udp.Client.SendTimeout = 3000; 
      //udp.Client.SetSocketOption(SocketOptionLevel.Udp, SocketOptionName.ReuseAddress, true); 
      //^invalid 
     } 

     //await udp.SendAsync(data, data.Length, , portNumber); 
     //I changed from async to synchronous in case it was the issue, but no. 
     udp.Client.SendTo(data, new IPEndPoint(IPAddress.Parse(ipString), portNumber)); 
     //the receive used to be async, too 
     byte[] receivedByte = new byte[udp.Client.ReceiveBufferSize]; 
     try 
     { 
      udp.Client.Receive(receivedByte); 
     } 
     catch (Exception ex) 
     { 
      udp.Client.Shutdown(SocketShutdown.Both); 
      udp = null; // added these, but port still blocked until restart 
     } 

Ich benutze UWP, und es gibt Methoden zur Klassenbibliothek, die nicht hier sind.

+1

Glaubst du, dass ein Problem im Zusammenhang mit einem Rückstand oder einer begrenzten Anzahl von Sockets auftreten kann, die geöffnet werden dürfen? –

+0

@Am_I_Hilflich weiß es nicht, denke aber nicht ... Ich schätze, es ist möglich, dass es sich um ein externes Problem handeln könnte ... – Tyress

+0

Könnten Sie bitte ein minimales Beispiel für die Reproduktion Ihres Problems verwenden? –

Antwort

1

Nachdem ich UdpClient in eine using() -Anweisung gestellt habe, anstatt sie als privates Feld zu deklarieren, und den Umfang durch eine kurze asynchrone Methode zu begrenzen, habe ich diese Probleme nicht mehr.

+1

OK, es ist gut;) –

Verwandte Themen