Zum Inhalt springen

closesocket() bei winsock2.h


Net-srac

Empfohlene Beiträge

Hi, ich hab hier ein Problem mit einer Socketanwendung, die nicht richtig geschlossen wird.

Ich nutze diese Socketverbindung nicht um Daten zu übertragen sondern um eine Verbindung einer Netzwerkkarte zu einem Server zu testen. Dabei gehe ich wie folgt vor.

Ich erzeuge das socket...

lSocket = socket( PF_INET, SOCK_STREAM, 0);

...binde es auf eine lokale IP...

int bind_err = bind( lSocket, (sockaddr*)&local_sin, sizeof( sockaddr_in));

versuche eine Verbindung herzustellen

int err = connect(lSocket, (struct sockaddr*)&server_sin, sizeof( server_sin));

.... und will ihn wieder schließen.

if(closesocket(lSocket)<0)cout<<"Fehler beim Schliessen des Sockets";

Nur wenn ich diese Anwendung 2. innerhalb 3 min starte bekomme ich einen 10048 fehler, also "already in use".

Hab ich irgendwas falsch gemacht? Ich kann nämlich keinen Fehler finden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

...getestet aber beim ersten durchlauf gibt closesocket eine 1 zurück.

also kein fehler

0 bedeutet keinen Fehler!

in der msdn stehen bei closesocket ca 6 Fehlermeldungen.

schreib mal nach closesocket if (WSAgetlasterror == ****) und setzt für **** die

Fehlermeldungen der Reihe nach ein. Versuch so mal rauszufinden was der Fehler ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

setz mal folgendes zwichen socket () und bind ():

int turn_on_option_flag;

int nSockopt = setsockopt (lSocket, SOL_SOCKET, SO_REUSEADDR, (char*)

&turn_on_option_flag, sizeof (turn_on_option_flag));

hab's selber nicht ausprobiert, nur an hand der msdn so zusammengestückelt. :D

also viel glück dabei ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Net-srac

Hab ich irgendwas falsch gemacht? Ich kann nämlich keinen Fehler finden.

Nein, hast Du nicht. Das ist das Defaultverhalten. Auch wenn Du den Socket schliesst und die Anwendung terminierst, wird die Socket-Datenstruktur vom Betriebssystem nicht sofort freigegeben, um sie gegebenenfalls nochmals verwenden zu koennen. Um den Socket lokal sofort wiederverwenden zu koennen, muss ueber setsockopt (siehe oben) die entsprechende Option gesetzt werden.

Nic

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab hier die MSDN vor mir liegen in der setsockopt beschrieben ist, nur irgendwie steig ich nicht dahinter. Ich hab es jetzt so gemacht.

int turn_on_option_flag = true;

int nSockopt = setsockopt (lSocket, SOL_SOCKET, SO_DONTLINGER, (char*) &turn_on_option_flag, sizeof (turn_on_option_flag));

weil da drin steht, das SO_DONTLINGER das Socket schließt ohne lange nachzufragen. Machen tut er es aber trotzdem nicht. Also nach einem sofortigen Start meines Progs kommt wieder ein 10048 error.

any suggestions??

thnx

Link zu diesem Kommentar
Auf anderen Seiten teilen

:confused: komplexer Satzbau ;)

Also in der MSDN steht, SO_DONTLINGER schließt den Socket hart, also ohne nachzufragen. Vielleicht mache ich ja auch beim methodenaufruf einen fehler?!!?

bool turn_on_option_flag = true; // IST DAS RICHTIG?

int nSockopt = setsockopt (lSocket, SOL_SOCKET, SO_DONTLINGER, (char*) &turn_on_option_flag, sizeof (turn_on_option_flag));

Ist der Aufruf überhaupt korrekt, oder wie setzt man die Option DONTLINGER sonst?!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Genau das hab ich in meinem Prog auch drin. Aber es geht trotzdem net. :(

Ich hab hier mal den Problemcode mal hochgeladen. Vielleicht könnt ihr ihn ja kompilieren und ausführen. Vielleicht ist mein VStudio nur falsch eingestellt oder installiert.

Unter Projekt-> Einstellungen müssen unter linker noch die Ws2_32.lib und wsock32.lib eingebunden werden.

Nun solltet ihr das Prog zweimal direkt nacheinander starten. Wenns nicht geht weiß ich auch nicht mehr weiter. Dann fahr starte ich halt nach dem Programmdurchlauf das System neu. Dann ist der socket sicher frei :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...