Verbindung trennen / Winsocks



  • Du verbindest also den ClientSocket mit dem ServerSocket und trennst dann die Verbindung vom ClientSocket aus und schließt den Socket vom Client und Server.
    Dann erzeugst du ServerSocket und ClientSocket neu und es geht nicht mehr ?



  • geeky (not@home) schrieb:

    Du verbindest also den ClientSocket mit dem ServerSocket und trennst dann die Verbindung vom ClientSocket aus und schließt den Socket vom Client und Server.
    Dann erzeugst du ServerSocket und ClientSocket neu und es geht nicht mehr ?

    Genau. Aber die Verbindung wird auf beiden Seiden mit closesocket() geschlossen, und nicht "vom ClientSocket aus", oder was meinst du damit?



  • Naja, ne echte Verbindung besteht ja nur, wenn Server-Socket den Client-Socket angenommen hat, wenn nun der Client-Socket geschlossen wird, ist ja praktisch keine Verbindung mehr da.

    Hmm, demnach scheint ja alles richtig gemacht zu werden, sehr merkwürdig.

    Was mich noch ein wenig irritiert:
    Wieso benutzt du bei listen(), bind(), etc. überall Pointer beim 1. Parameter ?
    Und was ist DSocket ?



  • geeky schrieb:

    Naja, ne echte Verbindung besteht ja nur, wenn Server-Socket den Client-Socket angenommen hat, wenn nun der Client-Socket geschlossen wird, ist ja praktisch keine Verbindung mehr da.

    Hmm, demnach scheint ja alles richtig gemacht zu werden, sehr merkwürdig.

    Was mich noch ein wenig irritiert:
    Wieso benutzt du bei listen(), bind(), etc. überall Pointer beim 1. Parameter ?
    Und was ist DSocket ?

    Bei listen(), blind(), etc. wird halt der Pointer auf DSocket (das ist einfach ein vorher definierter Socket) übergeben, ja etwas umständlich aber warum das so ist ist jetzt egal.

    Also send und recv funktionieren auch schon, und es klappt auch alles was wir wollen, nur man kann halt nicht ein zweites mal ServerSocket ausführen ohne ne Fehlermeldung zu kriegen, nachdem man schonmal eine Verbindung hatte.

    mfg.



  • Ist es denn dann beabsichtigt das DSocket beim Client und ServerSocket vorkommt ?
    Überschreibt sich das nicht gegenseitig oder sind Client und Socket jeweils in einer anderen Anwendung ?



  • geeky schrieb:

    Ist es denn dann beabsichtigt das DSocket beim Client und ServerSocket vorkommt ?
    Überschreibt sich das nicht gegenseitig oder sind Client und Socket jeweils in einer anderen Anwendung ?

    Welcher Socket ist in einer anderen Anwendung??? Versteh ich nicht ganz den zweiten Satz.

    Auf jeden fall sind beide funktionen in der gleich anwendung, und der client führt die clientsocket aus und der server die serversocket. Der DSocket überschneidet sich dann nicht weil er ja auf 2 PCs ist.

    mfg.



  • Den Socket der am Port lauscht schließt man ja nur am Ende des Programms.



  • Beim Nochmal-Angucken springt mir dieses ins Auge:

    //accept
      connected_socket = accept( *s, NULL, NULL );
        *s = connected_socket;
        Tfertig = true;
    

    Wieso weisst du *s den connected_socket zu ?
    Damit hast du den listen()-socket überschrieben und bei einem späteren closesocket(*s) schließt du nur die Client-Verbindung aber nicht den Listen-Socket.

    Edit: Im meinem letzten Post meinte ich "Client und Server" statt "Client und Socket", aber meine Frage wurde ja trotzdem beantwortet 😉



  • Wir (joomoo und ich)

    haben das jetzt in

    *s = accept( *s, NULL, NULL );
    

    geändert.

    Wie sollte der Code den sonst aussehen beim Server?

    EDIT: Es funktioniert mit dem geändertem Code auch nicht...



  • SOCKET *s = DSocket;
    

    Was ist DSocket für ein Socket?
    Du legst einen Pointer auf diesen Socket an und immer wenn du diesen Pointer benutzt greifst du also direkt auf diesen Socket zu.

    Ob du nun

    connected_socket = accept( *s, NULL, NULL );
        *s = connected_socket;
    

    schreibst oder

    *s = accept( *s, NULL, NULL );
    

    ist im Endeffekt egal.
    Ich denke das Problem liegt darin, dass du DSocket überschreibst und deshalb darauf beim zweiten Mal nicht zugegriffen werden kann.
    Das ist aber nur eine Vermutung, da ich nicht genau weiß was DSocket überhaupt für ein Socket ist.



  • Es geht jetzt, ich habe die ServerSocket funktion ein bisschen umprogrammiert, so das in der Funktion ein neues Socket erstellt wird, das dann auf dem Port lauscht. Sobald eine verbindung mit accept angenommen wird, wird das zurückgegeben Socket dem richtig Socket zugewiesen (das mit dem das Programm arbeitetet), dann wird das listen socket noch in der Server Socket Funktion wieder geschlossen.

    thks



  • Habe derzeit genau das selbe Problem.

    while(!TerminateNetworkThread)
    	{
         AcceptSocket = SOCKET_ERROR;
         while ( AcceptSocket == SOCKET_ERROR )
    	      AcceptSocket = accept(s, NULL, NULL );
      	do
      	{
          bytesRecv = recv(AcceptSocket, recvbuf, 32, 0 );
    	    if(bytesRecv > 2)
    	      MessageBox(NULL,	recvbuf, "data", MB_OK	| MB_ICONINFORMATION );
    	    else if(bytesRecv == SOCKET_ERROR)
    	      MessageBox(NULL,	"Connection lost.", "Info", MB_OK	| MB_ICONINFORMATION );
    		} while(bytesRecv != SOCKET_ERROR);
    		shutdown(AcceptSocket, SD_BOTH);
    		closesocket(AcceptSocket);
    	 }
    

    Nachdem der Client die Verbindung getrennt hat, kann er sich noch einmal erfolgreich mit dem Server verbinden und Daten übertragen. Sobald die Verbindung aber wieder (d.h. zum zweiten Mal) getrennt wird, ist es nicht mehr möglich sich erneut mit dem Server zu verbinden, dieser kommt aus dem recv() nicht mehr zurück und produziert 100% Prozessorauslastung.



  • Problem gelöst. recv() liefert 0 zurück wenn die Verbindung korrekt getrennt wurde, das wurde nicht abgeprüft.


Anmelden zum Antworten