Laden...

Komisches Verhalten des TcpListeners

Erstellt von BenjaminB82 vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.408 Views
B
BenjaminB82 Themenstarter:in
29 Beiträge seit 2007
vor 15 Jahren
Komisches Verhalten des TcpListeners

Hallo allerseits!

Ich habe einen Windows-Dienst, der auf einem bestimmten Port auf Nachrichten wartet. Hier ist der entsprechende Code:


public void StartWaitForConnections()
        {
            try
            {
                TcpListener myList = new TcpListener(_intPort);

                myList.Start();

                while (_bRunListener)
                {
                    Socket s = myList.AcceptSocket();
                    s.LingerState = new LingerOption(false, 0);
                    OnDataArrival(s);
                }
                myList.Stop();
            }
            catch (ThreadAbortException)
            {
                return;
            }
            catch (Exception)
            {

                throw;
            }
        }

Es passiert im Prinzip folgendes: Wenn auf dem Port eine Nachricht eingeht, wird ein neues Socket-Objekt erstellt und dieses mit einem Event (OnDataArrival) an eine ausstehende Klasse weitergegeben, die dann für die weitere Verarbeitung einen neuen Thread startet.

Dies funktioniert auch alles ganz fein.

Allerdings passiert rund alle sieben, acht Tage folgendes: Es können keine Nachrichten mehr angenommen werden (z.B. läuft Telnet in einen Timeout). Wenn ich dann den Dienst beende und neu starte wirft die Applikation manchmal eine Socket-Ausnahme:


System.Net.Sockets.SocketException: Normalerweise darf jede Socketadresse (Protokoll, Netzwerkadresse oder Anschluss) nur jeweils einmal verwendet werden
   at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)

Dies bedeutet für mich, dass das Programm offenbar noch auf dem Port lauscht, auf dem es offenbar keine Nachrichten mehr entgegen nehmen kann.

Hat jemand schonmal etwas ähnliches erlebt?

Gruß
Benjamin

2.760 Beiträge seit 2006
vor 15 Jahren

Gibst du deine Sockets auch irgendwann mal wieder frei?

B
BenjaminB82 Themenstarter:in
29 Beiträge seit 2007
vor 15 Jahren

Die Methode, die in einem extra Thread ausgeführt wird, hat als Abschluss im Finally-Ast folgenden Code


socket.Close()

Ist das ausreichend oder braucht man noch mehr?

2.760 Beiträge seit 2006
vor 15 Jahren

Nein, ich denke das sollte reichen.

E
24 Beiträge seit 2006
vor 15 Jahren
Thread

Hallo BenjaminB82,

also ich hatte ein ähnliches Problem. Allerdings lag es bei mir nicht an den Socketverbindungen sondern an Thread's die sich nicht sauber beendeten obwohl der GC zyklisch aufgerufen wurde und der Thread sauber verlassen wurde.
Ich hab mir ein ThreadArray angelegt.. dieses lauf ich zyklisch ab und prüfe ob die Therad's noch aktiv sind.. ansonsten werden sie mit .abort beendet. Seit dem läuft das Ding für die Ewigkeit 🙂

Vielleicht hilf dir das ja.

Gruß Euro