C# UdpClient ConnectionReset Problemchen

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.107
Hallo, ich schreibe gerade eine Testapplikation die erlauben sollte GTP Echos abzuschicken. Ein Echo muss aber (wie der Sinn des Echo's ist) auch beantwortet werden.

Dabei Benutze ich UdpClient über mehrere Threads zum versenden und empfangen der GTP nachrichten.

Zu dem Empfang Code:

Code:
        /// <summary>
        /// Execute Listening on given UDP port
        /// </summary>
        /// <param name="parameter">parameter with port number and udpclient</param>
        public void ListenUdp(Object parameter)
        {
            var param = parameter as UdpParameters;
            if (param != null)
            {
                try
                {
                    var version = param.Version;
                    var ep = new IPEndPoint(IPAddress.Any, param.Port);
                    param.Client = new UdpClient(new IPEndPoint(IPAddress.Any, param.Port));
                    param.Client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                    int interrupted = 0;
                    while (StopReceiving == false && interrupted < 10)
                    {
                        var array = new Byte[0];
                        try
                        {
                            array = param.Client.Receive(ref ep);
                            interrupted = 0;
                        }
                        catch (SocketException se)
                        {
                            if (se.SocketErrorCode == SocketError.Interrupted)
                            {
                                interrupted++;
                                continue;
                            }
                            MessageBox.Show("Message Could not be delivered: " + se.SocketErrorCode.ToString());
                        }
                        var data = new IncommingMessages { Message = array, Time = DateTime.Now, Version = version, Port = param.Port, FromTo = ep };
                        ///Wait for response
                        if (data.Type == 1)
                        {
                            this.AddIncommingData(data);

                            var response = PrepareGtpData(data.Message, version);
                            ep.Port = param.Port;
                            param.Client.Send(response, response.Length, ep);
                            data = new IncommingMessages { Time = DateTime.Now, Message = response, Version = version, Port = param.Port, FromTo = ep };
                            this.AddOutgoingData(data);
                        }

                    }
                }
                finally
                {
                    if (param.Client != null)
                        param.Client.Close();
                }
            }
        }

Es wird für drei Ports jeweils ein Thread erstellt.
Es funktioniert alles. Mein Problem ist aber eh die Fehlerbehandlung.
Wenn die gegenseite nicht erreichbar ist, dann bekomme ich SocketException mit dem Error ConnectionReset. Ich kann aber damit nichts anfangen wenn ich den inhalt der Nachricht nicht bekommen. Ich kann leider auch nicht ReceiveFrom benutzen, da ich bis zu x (große Zahl) nachrichten gleichzeitig versende an viele Verschiedene Server.


Ein Wireshark trace ist als Bild vorhanden.
Es wäre super, wenn man die ICMP Nachricht auslesen kann. Wenn es ja doch nicht gehen sollte, so ist das kein großes Problem.


Danke
 

Anhänge

  • Unbenannt.jpg
    Unbenannt.jpg
    446,1 KB · Aufrufe: 165
roker002 schrieb:
Wenn die gegenseite nicht erreichbar ist, dann bekomme ich SocketException mit dem Error ConnectionReset. Ich kann aber damit nichts anfangen wenn ich den inhalt der Nachricht nicht bekommen.

Außerhalb des try catch die Nachricht welche du verschickts/erwartest ablegen dann kannst du im catch bei ConnectionReset die Nachricht wieder abrufen? Oder habe ich da einen Denkfehler?

Es wäre super, wenn man die ICMP Nachricht auslesen kann. Wenn es ja doch nicht gehen sollte, so ist das kein großes Problem.

Die klasse Ping hat ein Pingresult welches ausführlich beschreibt, falls ein Problem besteht, welches das ist.
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben