none
Windows Sockets und BIND ERRORS RRS feed

  • Frage

  • Hallo Forum

    Eines unserer komplexen, vollständig in C++ (Visual Studio 2010) geschriebenen Systeme, zeigt manchmal das Problem, dass es keine Server-Sockets mehr öffnen kann. Im Detail scheitert das Aufbauen eines Server-Ports am "bind()" Befehl. Dies passiert meistens, wenn wir mit einer Maschine sehr viel testen, die Software oft starten, angeschlossenen Netzwerke (physikalisch) oft verändern bzw. ab- und anstecken.

    Ein Neustart unserer Software hilft in diesem Fall auch nichts … Windows (Windows Embedded Standard (Win7 Edition)) scheint dann generell die Fähigkeit verloren zu haben, Server-Ports anbieten zu können. Auch andere Anwendungen können kann keine Server-Ports mehr öffnen.

    Nun stellt sich mir die Frage, ob eine Anwendung überhaupt so einen Zustand durch Fehlprogrammierung erzeugen kann (immerhin werden normalerweise beim Beenden eines Prozesses alle zugeordneten Ressourcen wieder freigegeben .. falls das Programm diese vernascht haben sollte). Wenn ja, worauf sollten wir bei der Programmierung der Sockets achten?  

    Wenn nein, was kann man von Anwenderprogrammseite noch tun, um diesen Zustand zu bereinigen (außer dem User vorzuschlagen, die Maschine neu zu starten)?

    Grüße

    FireHeart

    Donnerstag, 23. Mai 2019 14:43

Alle Antworten

  • Hallo FireHeart,

    Hast Du versucht, die Ressourcen mit der Closesocket-Fuktion und der WSACleanup-Funktion freizugeben? Bitte beachte auch, dass beim Aufrufen der Setsockopt-Funktion vor der Bind-Funktion, TCP/IP-Optionen werden nicht mithilfe von TCP/IP überprüft, bis die Bind-Funktion eintritt. In diesem Fall ist der Aufruf der Setsockopt-Funktion immer erfolgreich, der Aufruf der Bind-Funktion kann jedoch fehlschlagen, da der frühe Aufruf von der Setsockopt-Funktion fehlgeschlagen ist. Alle diese Themen werden im folgenden Thread bereitgestellt:
    setsockopt function
    Verwendest Du die SO_EXCLUSIVEADDRUSE-Option? Dadurch wird verhindert, dass andere Sockets zwangsweise an dieselbe Adresse und denselben Port gebunden werden. Diese Vorgehensweise wird durch die SO_REUSEADDR-Option aktiviert, wie in diesem Artikel beschrieben:
    Using SO_EXCLUSIVEADDRUSE

    Gruß,

    Ivan Dragov


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 24. Mai 2019 12:05
    Moderator
  • Hallo Ivan

    Natürlich schließe ich alle Verbindungen, wenn möglich, mit "closesocket" ab. Ein WSACleanUp hab ich jetzt im gesamten Source auf die Schnelle nicht entdeckt. Es ist aber auf jeden Fall so, dass wenn das OS mal in diesem Zustand ist, gar kein Prozess mehr mit Ethernet funktioniert.

    Ich hab mir auch die Anzahl der Handles unseres Prozesses angesehen (Task Manager), als das System in diesem Zustand war … es waren überschaubare 150 Stück.

    Die setsockopt Funktion kommt bei mir nicht zum Einsatz, daher auch kein SO_EXCLUSIVEADDRUSE.

    Grüße

    FireHeart

    Montag, 27. Mai 2019 10:18