Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Komisches Verhalten des TcpListeners
BenjaminB82
myCSharp.de - Member



Dabei seit:
Beiträge: 29

Themenstarter:

Komisches Verhalten des TcpListeners

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
jaensen
myCSharp.de - Experte

Avatar #avatar-2657.png


Dabei seit:
Beiträge: 2.760
Herkunft: München

beantworten | zitieren | melden

Gibst du deine Sockets auch irgendwann mal wieder frei?
private Nachricht | Beiträge des Benutzers
BenjaminB82
myCSharp.de - Member



Dabei seit:
Beiträge: 29

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
jaensen
myCSharp.de - Experte

Avatar #avatar-2657.png


Dabei seit:
Beiträge: 2.760
Herkunft: München

beantworten | zitieren | melden

Nein, ich denke das sollte reichen.
private Nachricht | Beiträge des Benutzers
eurofreddy
myCSharp.de - Member



Dabei seit:
Beiträge: 24

Thread

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers