5 Stimmen

C# UDP-Listener un-blocking? oder verhindern, dass revceiving von stecken bleiben

Ich habe hier nach früheren Problemen wie dem meinen gesucht, aber es scheint, dass ich die Antwort, die ich brauche, nicht finden kann.

Mein Ziel ist es, zu verhindern, dass sich mein UDP-Listener nicht aufhängt. Ich habe einen UDP-Listener, der auf Nachrichten wartet, aber wenn es nichts zu empfangen gibt, bleibt er einfach hängen.

Ich habe in anderen Threads gelesen, dass ich die Einstellung Blockierung auf false aber ich kann nicht herausfinden, wie man sie einstellt. Sorry, ich bin nur neu in C# und Socket-Programmierung.

Hier ist der Teil meines Zuhörers:

while (true)
{
    try
    {
        byte[] data = listener.Receive(ref groupEP);

        IPEndPoint newuser = new IPEndPoint(groupEP.Address, groupEP.Port);
        string sData =  (System.Text.Encoding.ASCII.GetString(data));

    }
    catch (Exception e)
    {
    }
}

Mein Problem ist, dass er in der folgenden Zeile einfach einfriert:

byte[] data = listener.Receive(ref groupEP);

9voto

Jake T. Punkte 631

Verwenden Sie die Eigenschaft available des UDPClient (falls Sie diesen verwenden), um festzustellen, ob Sie Daten in der Netzwerkwarteschlange lesen können.

while (true)
{
    try
    {
        if (listener.Available > 0) // Only read if we have some data 
        {                           // queued in the network buffer. 
            byte[] data = listener.Receive(ref groupEP);

            IPEndPoint newuser = new IPEndPoint(groupEP.Address, groupEP.Port);
            string sData =  (System.Text.Encoding.ASCII.GetString(data));
        }
    }
    catch (Exception e)
    {
    }
}

2voto

        UdpClient client = new UdpClient();
        //Some code goes here ...
        client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 2000);

//Das ist ziemlich klar und einfach.

0voto

krolth Punkte 1012

Sie verwenden die blockierenden Versionen von Receive/Send. Verwenden Sie stattdessen die asynchronen Versionen (ReceiveAsync/BeginReceive).

https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.udpclient?view=netcore-3.1

0voto

Elmorr Punkte 1
TestHost.Client.Blocking = false;

Sie müssen auf das "Socket"-Objekt unterhalb des UdpClient-Objekts ("TestHost" im ausführlichen Beispiel unten) zugreifen, um die Eigenschaft "Blocking" wie gezeigt zu erhalten:

int Port = 9020;    //Any port number you like will do
IPAddress ActiveIPaddress = new IPAddress(new byte[] { 192, 168, 3, 10 }); //Any IPaddress you need will do
IPEndPoint HostEP = new IPEndPoint(ActiveIPaddress, Port);
UdpClient TestHost = new UdpClient(Global.HostEP);
TestHost.Client.Blocking = false;

Bildbeschreibung hier eingeben

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X