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
Gibst du deine Sockets auch irgendwann mal wieder frei?
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?
Nein, ich denke das sollte reichen.
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