none
UdpClient empfängt keine größeren Frames

    Frage

  • Hallo,

    ich habe eine spezielle Hardware, von der ich UDP Pakete an mein C# Programm auf meinem PC schicke. Das funktioniert recht gut, allerdings mit der Einschränkung, dass die UDP Pakete nur sehr klein sein dürfen. Ist das Paket länger als ungefähr 150 Byte, wird es vom PC Programm nicht empfangen. Ich schaue mir die Daten mit Wireshark an und sehe, außer den Daten des Pakets, keinen Unterschied. Wenn ich z.B. 250 Byte von meiner Hardware schicken möchte, klappt das mit einigen Paketen, die dann im Abstand von wenigen Millisekunden kommen, sehr gut. Nur als z.B. ein Paket reagiert der UdpClient nicht. Ich benutze ein synchrones receive in einem extra thread. Es kommt auch keine Exception.

                TDataBuffer B = Freier();
                try
                {
                    B.AddData(udpClient.Receive(ref B._RemoteEndPoint));
                    DetailTrace.AddLine(B.nBytes+" Byte von "+B.RemoteEndPoint+" in TDataBuffer mit Instanz "+B.InstanzId+" erhalten");
                    B.Status = eStatus.DatenEmpfangen;
                }
                catch (SocketException E)
                {
                    if (E.SocketErrorCode == SocketError.Interrupted) DetailTrace.AddLine("Empfangen wegen Close beenden");
                    else DetailTrace.AddLine("Exception " + E.SocketErrorCode + "  " + E.Message + " in TDataBuffer.Empfangener");
                    B.Clear();
                    B.Status = eStatus.frei;
                }
                catch (Exception E)
                {
                    DetailTrace.AddLine("Exception " + E.Message + " in TDataBuffer.Empfangener");
                    B.Clear();
                    B.Status = eStatus.frei;
                }
                return B;

    Bei den Socketoptions steht die Größe des Empfangsbuffers auf 64k. 

    Ist jemandem schon mal so etwas unter gekommen? Generell sollte es ja kein Problem sein, ein UDP Paket mit 1000Byte zu empfangen. Die UDP Verbindung ist übrigens über WLAN. Fragmentierung ist auch nicht verboten (obwohl man Fragmente ja in Wireshark sehen würde).

    Viele Grüße
    Erwin

    Sonntag, 2. Dezember 2018 19:32

Alle Antworten

  • Hi,

    ich habe eine kleine Demo erstellt, in der ich problemlos Daten >10.000 Byte senden kann (mehr habe ich auf die Schnelle nicht probiert). Ich habe auch nicht nachgeschaut, wo die Grenze ist.

    private async void StartList()
    {
    	await Task.Run
    		(() => StartListener());
    }
    
    private const int listenPort = 11000;
    private void StartListener()
    {
    	bool done = false;
    
    	UdpClient listener = new UdpClient(listenPort);
    	IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort);
    
    	try
    	{
    		while (!done)
    		{
    			byte[] bytes = listener.Receive(ref groupEP);
    
    
    			string s = ("Received broadcast from: " + 
    				groupEP.ToString() + System.Environment.NewLine +
    				Encoding.Default.GetString(bytes, 0, bytes.Length));
    
    		}
    
    	}
    	catch (Exception e)
    	{
    		Console.WriteLine(e.ToString());
    	}
    	finally
    	{
    		listener.Close();
    	}
    }

    Hängt es bei dir wirklich an der Länge der Daten oder hast du irgendwelche Sonder.- Steuerzeichen in deinen Daten?

    edit: ist scheinbar egal, wie groß die Daten sind, bei 50.000 byte hab ich aufgehört...

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP


    Sonntag, 2. Dezember 2018 21:07
  • Bei mir funktioniert es immer noch nicht. Vielleicht liegt es ja an dem ESP8266 Board, mit dem ich die Daten schicke. Allerdings lasse ich mir ja auf dem PC die empfangenen Daten mit Wireshark anzeigen. Ein Paket mit einer Länge von 95 wird vom Listener empfangen, ein Paket von 105 Byte aber nicht.

    Ich habe auch mal ein UDP Test Tool installiert, mit dem man den Empfang auf einen Port anzeigen kann. Dieses Tool zeigt auch die größeren Pakete an. Also liegt es wohl an meinem Programm. Ich habe zwar noch keine Erklärung dafür, muss aber mal weiter debuggen oder erst einmal an anderes einfaches Empfangsprogramm mit C# erstellen.

    Gruß
    Erwin

    Donnerstag, 6. Dezember 2018 21:50
  •  muss aber mal weiter debuggen oder erst einmal an anderes einfaches Empfangsprogramm mit C# erstellen.

    Hi, gleichzeitig würde ich noch ein kleines Testprogramm erstellen, mit dem du Daten (von einem anderen PC) zu deinem eigentlichen Programm schicken kannst.

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Freitag, 7. Dezember 2018 08:48