Päckchenweises Auslesen aus dem Netz



  • Hallo zusammen,
    ich spiele gerade an einer Client/Server-Anwendung.

    Der Client schickt einfach die an ihn übergebenen Argumente an den Server. Dieser sollte sie einzeln entgegennehmen und verarbeiten. Macht er aber nicht, er nimmt sie alle auf einmal. Wie kann ich das abstellen?

    der Client:

    for ( laufvar = 1; laufvar < argc; laufvar++ )
    	{
    		strcpy( netstring, argv[laufvar]);
    		printf("Sende jetzt %s an den Server\n", netstring);
    
    		if (send ( client_socket, netstring, strlen(netstring), 0 ) == -1 )
    		{
    			perror ("Fehler bei der Uebertragung!\n");
    		}
    

    Wenn ich den client aufrufe:

    pumclient hallo ich bins

    Wird ein Wort nach dem anderen an den Server übertragen:

    Sende jetzt hallo an den Server
    Sende jetzt ich an den Server
    Sende jetzt bins an den Server

    Und nun der Server:

    memset (netstring, 0, NETLEN);
    		if ( (client_socket = accept ( server_socket, (struct sockaddr *) &client_address, &client_len )) == -1 )
    		{
    			perror ("Fehler bei der Annahme der Clientverbindung\n");
    		}
    		else
    		{
    			printf ("Ein Client (%s) ist verbunden ...\n", inet_ntoa (client_address.sin_addr));
    			connections++;
    
    			if ( (recv (client_socket, netstring, NETLEN-1, 0) ) == -1 )
    			{
    				perror ("Fehler beim Empfang der Nachricht\n");
    			}
    			printf ("Nachricht: %s \n", netstring);
    			commandparser(netstring);
    

    Dabei wird der Puffer-String aber komplett vollgeschrieben:

    Nachricht: halloichbins

    mir ist bewusst, so wie es jetzt ist, kann er nur das erste Wort verarbeiten! aber das reicht mir erst mal, Eins nach dem Anderen. Aber was muss ich verändern, daß das obrige recv nur das erste Wort empfängt (in meinem Beispiel also 'hallo') und dieses dann weitergibt?

    Vielen Dank

    Gruss Christian



  • Das geht nicht. TCP ist ein Streamprotokoll und kein Paketbasiertes! Du müsstest dir eine Information mitschicken, wo das erste Wort aufhört.



  • du kannst versuchen, per setsockopt TCP_NODELAY im client zu setzen. TCP_NODELAY schaltet den nagle algorithmus aus, sodass zumindest die möglichkeit besteht, dass du bei jedem write ein paket absendest. aber auch das ist nicht fix dann. die tcp(4) manpage sagt dir genaueres zu TCP_NODELAY.
    im server kann es immer noch passieren, dass er mehrere tcp pakete bekommt und bei einem read zurückgibt.



  • Ja stimmt der Nagel-Algorithmus, die Informationen so schnell wie Möglich aus der Netzwerkpipe in den Prozess-Kontext der Zielprozesse zu schieben. Was macht man da am besten? Die Informationen in eine Struktur schreiben?

    Gruss Christian



  • du musst dazu udp verwenden. mit tcp wirst auf keinen grünen zweig kommen...

    edit: nagle is mir anders bekannt, aber ich bin ja nicht allwissend 🙂


Log in to reply