TCP/IP Server der einen Client mehrmals connecten lassen kann



  • Hi,

    Ich möchte einen kleinen TCP/IP Server schreiben der einen (!) Client mehrmals hintereinander connecten lassen kann. Also der Server soll fähig sein einen Client gleichzeitig zu bearbeiten, aber der Client soll die Verbindung auch schließen und später wieder aufnehmen können. Ich dachte das ginge ganz einfach so:

    Pseudo-Code:

    sock = create_socket();
    
    bind(sock);
    
    listen(sock);
    
    for(;;)
    {
    	accept(sock);
    
    	for (;;) 
    	{
    		rc = recv(...);
    		if(rc==0) break;
    	}
    
    	closesocket(fd);
    }
    

    ...lässt den Client aber nur einmalig connecten, ansonsten keine Reaktion.

    Edit: Also wenn ich den client starte (der automatisch verbindet) geht es einwandfrei. Dann schließe ich den client und starte ihn wieder, geht nicht.



  • Aus deinem pseudocode kann man nicht viel entnehmen, ausser dass der Code den er widerspiegeln soll wohl ziemlich schrecklich sein muss.



  • Es gibt eine Socketoption, SO_REUSE_ADRESS.

    Musst mal danach schauen...

    Eine weitere alterative wäre es, einen Thread pro Socket zu spendieren.
    Du kannst dann immer mit einem bestimmten Port anfangen, sagen wir mal 10000.
    Wenn sich jemand mit dem Port 10000 verbunden hat, startest Du in einem neuen Thread einen Server mit dem Port 10001, der dann im Listen-Zustand ist....

    Gruß Paddy



  • Huhu, winke-winke, accept() erzeugt einen neuer Port, da braucht man keinen neuen um nachher noch weitere Verbindungen annehmen zu können!?!



  • Aber meines Wissens nur, wenn man die SO_REUSE_ADRESS Option setzt.

    Ich habe mich lange nicht mehr mit "low level" Netzwerkprogrammierung beschäftigt. Ich nutzte dafür immer ACE.



  • Das braucht man nur, wenn man sich mehrfach an den gleichen Socket binden will. Normalerweise braucht man es also nicht.



  • Paddy82 schrieb:

    Eine weitere alterative wäre es, einen Thread pro Socket zu spendieren.

    richtig, oder man macht es mit non-blocking sockets und 'select'.
    macht man weder das eine noch das andere, dann 'hängt' der server (wie in dem code von Luke-2) bei einer verbindung fest.
    die lokale portnummer ist in den meisten fällen uninteressant.
    🙂



  • @vista: es geht laut dem OP nicht darum dass der Server "hängt" während der 1. Client connected ist, sondern dass er kein 2. mal connecten kann NACHDEM der 1. Client bereits disconnected hat.



  • Luke-2 schrieb:

    ...lässt den Client aber nur einmalig connecten, ansonsten keine Reaktion.

    Edit: Also wenn ich den client starte (der automatisch verbindet) geht es einwandfrei. Dann schließe ich den client und starte ihn wieder, geht nicht.

    Und was liefert dir connect als Fehler? Nen Timeout oder was?

    gruss
    v R


Anmelden zum Antworten