Listen-Socket richtig in eine Schleife bauen



  • Hi!

    Ich probiere gerade ein Bischen mit Sockets rum. Jetzt würde ich gerne wissen, wie ich den Server am Besten in eine Schleife einbaue. Der server soll Daten empfangen und verarbeiten, solange eine Verbindung besteht. Wenn keine Verbindung mehr besteht soll er wieder auf eine neue Verbindung warten.

    Ich habe mir das so irgendwie gedacht:

    do
    {
        socket = accept(...);
    
        do
        {
            recv(..., buffer, ....)
        }while (Verbindung steht)
    
    }while (strcmp(buffer, "quit") != 0)
    

    Könnte man das so lassen, oder gibts da eine bessere ausgefeiltere Technik?
    Vor allem würde ich gern wissen, wie man untersucht, ob eine Verbindung besteht.
    Muss man den socket auf irgend ein ERROR o.ä. abfragen?

    Wäre schön wenn mir jemand ein kleinen Codeschnipsel posten könnte, welcher das ganze erledigt 🙂

    Danke, Askyer!



  • hier findest du jede menge schnipsel
    http://www.c-worker.ch/



  • Askyer_ schrieb:

    Könnte man das so lassen, oder gibts da eine bessere ausgefeiltere Technik?

    könnte so gehen. dein progrämmchen kann aber nicht während eine verbindung besteht eine weitere bearbeiten. sowas kriegste z.b. mit mehreren threads hin.

    while (1)
    {
       accepted_sock = accept (...);
       neuer_empfangsthread (accepted_sock, ...);
    }
    

    die threads müssen sich selbst beenden, wenn die verbindung geschlossen wurde.

    Askyer_ schrieb:

    Vor allem würde ich gern wissen, wie man untersucht, ob eine Verbindung besteht. Muss man den socket auf irgend ein ERROR o.ä. abfragen?

    man kann u.a. am rückgabewert von 'recv' oder 'send' erkennen ob die verbindung noch da ist.



  • Danke für euere Antworten.

    Ich habe es mal Probiert, aber ein kleines Problem dabei.

    Folgender Code funktioniert:

    do
    {
    
    	connectedSocket = accept(acceptSocket, NULL, NULL);
    
    	while (recv(connectedSocket, buffer, 256, 0) != 0)
    	{
    		MessageBox(NULL, buffer, "Test", MB_OK);
    		ZeroMemory(buffer, 256);
    	};
    	closesocket(connectedSocket);
    }
    while (strcmp(buffer, "QUIT") != 0);
    

    Ich habe mal zum Test TCPView von Sysinternals laufen.

    Der offene Port steht auch drin, wenn ich mich jedoch verbinde, dann die Verbindung trenne, und wieder verbinde..... etc. Dann hab ich mehrmals folgende Einträge in TCPView:
    Process: [System Process]:0
    Protocol: TCP
    Local Address: notebook:[irgendeinport]
    Remote Address: localhost:12345
    State: TIME_WAIT

    Das ganze bleibt ca. jeweils 1-2 Minuten drin, bevor der eintrag verschwindet, und wieder nurnoch

    Process: Server.exe:1380
    Protocol: TCP
    Local Address: notebook:12345
    Remote Address: notebook:0
    State: LISTENIG

    drinsteht.

    Ist das normal, oder liegt das an einer unsauberen Programmierung von mir?

    MfG, Askyer



  • Askyer_ schrieb:

    Ist das normal, oder liegt das an einer unsauberen Programmierung von mir?

    wohl eher am unsauberen beenden der verbindung 😉
    im 'time-wait' state wartet der socket auf das 'fin' von der gegenstelle, das offenbar nie ankommt


Anmelden zum Antworten