Socket: "dynamischer" Puffer?



  • Hallo zusammen,

    ich bastel z.Z. an einem "simplen" Socketserver und Socketclient, ähnlich wie er auf www.c-worker.ch zu finden ist (ein gutes Tutorial).

    Das Problem, dass ich jetzt habe ist, dass ich mehr Daten (String) versenden und empfangen will/muss, als der Puffer groß ist.

    Wie kann ich es bewerkstelligen, dass recv das Ende des gesendeten Strings erkennt?

    Ich habe mir für das Empfangen eine Funktion geschrieben:

    string SocketReceiveMessage(SOCKET s_source)
    {
    	int int_result = 0;
    	char chr_buffer[256];
    	string str_message;
    
    	do
    	{
    		int_result = recv(s_source, chr_buffer, 256, 0);
    		if (int_result == 0)
    			break;	// connection lost
    		else if (int_result < 0)
    			break;	// error
    		else
    		{
    			chr_buffer[int_result] = '\0';
    			str_message.append(chr_buffer);
    		}
    
    	} while (int_result > 0);
    
    	return str_message;
    }
    

    Hier muss z.B. die andere Seiter erst die Verbindung kappen, damit diese Seite merkt, "es kommt nix mehr".



  • Entweder Du sendest zuerst die Länge (4 Byte), dann den Inhalt (n Bytes) oder Du verwendest ein End of String Zeichen und liest bis das besagte Zeichen kommt.

    BTW: Ich würde die empfangenen Daten zuerst in ein Buffer (z.B. std::vector) speichern und wenn dein Typ (z.B. c- string) vollständig übermittelt ist die konvertierung vornehmen.

    Simon

    Edit: Im folgenden Post handelt es sich exakt um daselbe Problem:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-240764-and-highlight-is-.html



  • Ok. Danke für's Erste. Das habe ich mir eigentlich auch schon fast gedacht.
    Ich werde mal beides ausprobieren und dann mal gucken.
    Aber erst Morgen. Jetzt geht's heim. 🙂



  • ich würde die typen nicht abkürzen und zur sicherheit alle variablen initialisieren.

    int int_result = 0; 
    char char_buffer[256] = {0}; 
    string string_message = "";
    


  • ist das eronisch gemeind?


Anmelden zum Antworten