Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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.

Also, grad eben getestet aber beim ersten durchlauf gibt closesocket eine 1 zurück. also kein fehler.

Beim neustart bleibt allerdings der error 10048

ja klar, aber ich weiß nicht was es benutzt, da ich mein socket doch am ende mit close schließe.

also ich lasse mir bei alles socketmethoden mit WSAgetlasterror die fehler ausgeben und prüfe immer die rückgabewerte. Ich kann aber beim ersten durchlauf keinen fehler feststellen bzw. bekomme keinen ausgegeben.

...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.

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 ;)

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

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

hast du mal SO_REUSEADDR ausprobiert?

ja, das tut aber auch nix. :(

nope, 0, also keinen fehler. Es scheint wirklich nur an dem LINGER zu liegen, den er nach dem close macht, aber ich bekomm ihn nicht weg... :(

: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?!

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

Hmm, wäre eigentlich kein Problem, da sie sich ja binnen 2-3 min selbst schließen. Obwohl es nicht die optimalste Lösung wäre, da dieses stückchen Software auf vieeeeele PC's kommen soll und ich nicht weiß was da alles an Ports frei ist.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.