Robert Bienert: Linux , C++ , TCP-Socket

Beitrag lesen

Moin!

ich habe ein Problem beim coden eines TCP Servers:

// Beispiel 1:

char echo_buffer[1024] = {""};
if((recv_size = recv(client_socket, echo_buffer, 1024,0)) < 0) { // error
}
echo_buffer[recv_size] = '\0';
printf("%s", echo_buffer); // funktioniert

// Beispiel 2:
// Funktioniert dagegen nicht:
string result = "";
while((recv_size = recv(client_socket, echo_buffer, 1024,0)) > 0) {
echo_buffer[recv_size] = '\0';
result += echo_buffer;
}
printf("%s", result.c_str());

  
Kleine Anmerkung: Aus Performance-Gründen dürfte die Verwendung eines stringstreams günstiger sein als in jedem Schleifendurchlauf den string zu verlängern.  
  

> Das Erste Beispiel Funktioniert, Aber nur wenn die Anfrage nicht länger als 1024 Zeichen ist.  
  
Und wenn du den Puffer vergrößerst? Schiefgehen kann damit ja nichts, weil recv soviel liest, wie kommt und nicht so lange wartet, bis der Puffer voll ist.  
  

> Die 2. Version funktioniert (sehr bedingt). Wenn der Client die Verbindung trennt nachdem er seine Nachricht übermittelt macht der Server weiter und gibt `result` aus.  
> Meine Erklärung ist das recv blockt. Sie holt solange die Zeichen ab bis keine mehr kommen und wartet nun das welche kommen (blocking). Es kommen aber keine. An dieser Stelle sollte die while-Schleife abbrechen da die Nachricht ja zu Ende ist.  
  
Soweit ich die [Manpage zu recv(2)](http://www.freebsd.org/cgi/man.cgi?query=recv&apropos=0&sektion=2&manpath=SuSE+Linux%2Fi386+8.2&format=html) richtig gelesen und meine eigenen Programmierbeispiele dazu richtig verstanden habe, bedeuten die Rückgabewerte von recv sowie recvfrom:  
  
-1: Oh, ein Fehler, bitte schau in errno nach  
≥ 0: Anzahl der gelesenen Bytes  
  
Wobei ich 0 so interpretiere, dass es nichts mehr zu lesen gibt, aber kein Fehler aufgetreten ist. Das sollte doch deine Abbruchbedingung sein, oder?  
  
Viele Grüße,  
Robert