Veröffentlicht 25. Oktober 200222 j 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.
25. Oktober 200222 j Also, grad eben getestet aber beim ersten durchlauf gibt closesocket eine 1 zurück. also kein fehler. Beim neustart bleibt allerdings der error 10048
25. Oktober 200222 j ja klar, aber ich weiß nicht was es benutzt, da ich mein socket doch am ende mit close schließe.
25. Oktober 200222 j 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.
25. Oktober 200222 j ...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.
25. Oktober 200222 j 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. also viel glück dabei
25. Oktober 200222 j 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
28. Oktober 200222 j 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
28. Oktober 200222 j 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...
28. Oktober 200222 j Ich glaube nicht das das an dem Linger liegt, weil in das anscheinend das socket schließt ohne zu berücksichtigen ob alle Daten gesendet wurden oder nicht. Also müßte er das socket in jedem Fall schließen.:confused:
28. Oktober 200222 j :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?!
28. Oktober 200222 j Also ich hab mir das mal in der msdn Library angeschaut und würde sagen das du das so richtig machst. Mal ne andere Frage warum nennst du dein Socket ISocket, also mit nem großen I davor? (hat nichts mit dem Fehler zu tun , aber I steht normalerweise vor COM-Interfacen).
28. Oktober 200222 j Du mußt doch am Anfang deines Programms die Funktion WSAStartUp ausführen, oder? Dann mach doch am Ende anstatt closesocket einfach WSACleanup(), bei mir klappt es so auch in einem anderen Socketprogramm. Gruß Guybrush
28. Oktober 200222 j 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
28. Oktober 200222 j Ich hab leider nur eingeschränkten Zugriff aufs internet von hier aus. Aber du mußt entweder closesocket oder WSACleanup benutzen, wobei ich WSACleanup empfehlen würde, weil die Funktion noch ein paar andere Dinge macht.
28. Oktober 200222 j @Net-srac: Du musst nicht jedesmal denselben lokalen Port verwenden. Wenn Du unterschiedliche verwendest, klappt es problemlos.
28. Oktober 200222 j Du musst nicht jedesmal denselben lokalen Port verwenden. Wenn Du unterschiedliche verwendest, klappt es problemlos. Werden dann nicht anstatt einem, mehere belegt die er normalerweise schließen sollte?
28. Oktober 200222 j 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.