Net-srac Geschrieben 25. Oktober 2002 Geschrieben 25. Oktober 2002 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. Zitieren
Guybrush Threepwood Geschrieben 25. Oktober 2002 Geschrieben 25. Oktober 2002 Was sagt den WSAGetLastError zu deinem closeSocket aufruf? Zitieren
Net-srac Geschrieben 25. Oktober 2002 Autor Geschrieben 25. Oktober 2002 Also, grad eben getestet aber beim ersten durchlauf gibt closesocket eine 1 zurück. also kein fehler. Beim neustart bleibt allerdings der error 10048 Zitieren
Guybrush Threepwood Geschrieben 25. Oktober 2002 Geschrieben 25. Oktober 2002 das bedeutet das das socket noch benutzt wird Zitieren
Net-srac Geschrieben 25. Oktober 2002 Autor Geschrieben 25. Oktober 2002 ja klar, aber ich weiß nicht was es benutzt, da ich mein socket doch am ende mit close schließe. Zitieren
Guybrush Threepwood Geschrieben 25. Oktober 2002 Geschrieben 25. Oktober 2002 Hast du mal gekuckt ob nicht schon vorher ein Fehler auftritt? Zitieren
Net-srac Geschrieben 25. Oktober 2002 Autor Geschrieben 25. Oktober 2002 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. Zitieren
Guybrush Threepwood Geschrieben 25. Oktober 2002 Geschrieben 25. Oktober 2002 ...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. Zitieren
vinc Geschrieben 25. Oktober 2002 Geschrieben 25. Oktober 2002 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 Zitieren
nic_power Geschrieben 25. Oktober 2002 Geschrieben 25. Oktober 2002 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 Zitieren
Net-srac Geschrieben 28. Oktober 2002 Autor Geschrieben 28. Oktober 2002 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 Zitieren
vinc Geschrieben 28. Oktober 2002 Geschrieben 28. Oktober 2002 hast du mal SO_REUSEADDR ausprobiert? Zitieren
Net-srac Geschrieben 28. Oktober 2002 Autor Geschrieben 28. Oktober 2002 ja, das tut aber auch nix. Zitieren
Guybrush Threepwood Geschrieben 28. Oktober 2002 Geschrieben 28. Oktober 2002 gibt closesocket immer noch 1 zurück? Zitieren
Net-srac Geschrieben 28. Oktober 2002 Autor Geschrieben 28. Oktober 2002 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... Zitieren
Guybrush Threepwood Geschrieben 28. Oktober 2002 Geschrieben 28. Oktober 2002 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: Zitieren
Net-srac Geschrieben 28. Oktober 2002 Autor Geschrieben 28. Oktober 2002 :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?! Zitieren
Guybrush Threepwood Geschrieben 28. Oktober 2002 Geschrieben 28. Oktober 2002 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). Zitieren
Guybrush Threepwood Geschrieben 28. Oktober 2002 Geschrieben 28. Oktober 2002 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 Zitieren
Net-srac Geschrieben 28. Oktober 2002 Autor Geschrieben 28. Oktober 2002 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 Zitieren
Guybrush Threepwood Geschrieben 28. Oktober 2002 Geschrieben 28. Oktober 2002 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. Zitieren
Klotzkopp Geschrieben 28. Oktober 2002 Geschrieben 28. Oktober 2002 @Net-srac: Du musst nicht jedesmal denselben lokalen Port verwenden. Wenn Du unterschiedliche verwendest, klappt es problemlos. Zitieren
Guybrush Threepwood Geschrieben 28. Oktober 2002 Geschrieben 28. Oktober 2002 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? Zitieren
Net-srac Geschrieben 28. Oktober 2002 Autor Geschrieben 28. Oktober 2002 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. Zitieren
Guybrush Threepwood Geschrieben 28. Oktober 2002 Geschrieben 28. Oktober 2002 hast dus denn jetzt mal mit wsacleanup anstatt mit closesocket probiert? Zitieren
Empfohlene Beiträge
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.