Buffer[1024] leeren
-
Hi,
Ich arbeite grade mit Sockets und habe es mittlerweile geschafft, eine Verbindung zwischen dem Server und Clienten herzustellen...
Jedoch funktioniert etwas nicht so wie ich es will:
Client: Huhu!
Server: Huhu! - Bis dahin ist alles perfekt...
Client: Wie geht´s?
Server: ╗╗╗╗╗╗╗╗╗╗╗
Client: Was?
Server: ╗╗╗
usw...Server:
//Empfangen: rc=recv(clients[i],buf,strlen(buf),0); //Senden: std::cout << "Client ( " << i << " ) : " << buf << std::endl; // antwort senden send(clients[i],buf,strlen(buf),0);
Client:
//Einlesen des Strings std::cout << "Client: "; std::cin.getline(buf,1024); //Senden des Strings send(s,buf,strlen(buf),0); //Empfangen des Strings vom Server rc=recv(s,buf,strlen(buf),0);
Ich bin mit dem Debugger öfters durchgegangen und habe bemerkt, dass der Server den buffer
[0]: 'H'
[1]: 'a'
[2]: 'l'
[3]: 'l'
[4]: 'o'
[5]: '\0'
[6]: ╗ (52) //oder so
[7]: ╗ (52)
//...bekommmt, sprich anscheinend wird die Null-Terminierung übersprungen?
Ich bin mit meinem Latein echt am Ende, wäre sehr dankbar wenn mir jemand helfen könnte.Wenn die Informationen nicht reichen bitte sagen.
Lg Fendrich
-
server:
//const size_t BUFFER_SIZE = 1024; //char buf[BUFFER_SIZE]; //int rc //Empfangen: rc = recv(clients[i], buf, BUFFER_SIZE, 0); if(rc < 0) //fehlerbehandlung - disconnect oder so int buf_length = rc; //Senden: std::cout << "Client ( " << i << " ) : " << std::string(buf, buf+buf_length) << std::endl; // antwort senden send(clients[i], buf, buf_length, 0);
client:
//Einlesen des Strings std::cout << "Client: "; std::cin.getline(buf,1024); int buf_length = std::cin.gcount(); //Senden des Strings send(s, buf, buf_length, 0);
bb
PS: Dir ist bekannt, dass man auch größere Teile schicken kann als der Empfangs-Buffer groß ist - siehe dazu GetLastError() oder so was in der Richtung...
edit: http://msdn.microsoft.com/en-us/library/ms740121(VS.85).aspx
WSAGetLastError() == WSAEMSGSIZE: http://msdn.microsoft.com/en-us/library/ms740668(VS.85).aspx#winsock.wsaemsgsize_2also so in etwa:
const size_t BUFFER_SIZE = 1024; std::string received; for(char buf[BUFFER_SIZE]; ; ) { int length = recv(clients[i], buf, BUFFER_SIZE, 0); if(length == SOCKET_ERROR) { int error_code = WSAGetLastError(); if(error_code == WSAEMSGSIZE) { received += std::string(buf, buf+BUFFER_SIZE); continue; } std::cout << "FEHLER" << std::endl; return; } received += std::string(buf, buf+length); break; } std::cout << "Client ( " << i << " ) : " << received << std::endl; for(size_t i(0), length(received.size()); i != length; { int sended = send(clients[i], received.c_str()+i, static_cast<int>(length-i), 0); if(sended == SOCKET_ERROR) { std::cout << "FEHLER" << std::endl; return; } i += sended; }
das empfangen beim client analog zum empfangen beim server...
-
Vielen Dank für deine Hilfe!
-
Fendrich schrieb:
Vielen Dank für deine Hilfe!
ich hoffe, du hast es verstanden!? ^^
falls nicht, trau dich ruhig, zu fragen