PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mehrere recv hintereinander?


freeze
20.10.2006, 09:39
Hey @all,

ich bin gestern auf ein Problem gestoßen. und wzar ist der MaxBuffer bei mir auf 1024 eingestellt.

hier empfange ich eben daten mittels "recv". Das Problem was ich nun habe ist, wenn ich sagen wir 1026 oder 1027 bytes sende, kann ich da mehrmals die "recv" funktion aufrufen, solange eben bis ich meine gesendeten bytes habe?

bsp.:

// gesendete bytes 1038
MAXBUFFER = 1024;
int received_bytes = 0;

while(received_bytes != 1038) {
received_bytes = recv(....);
}



Vielen Dank im Voraus

Lg freeze


Jan Krüger
20.10.2006, 13:42
Kannst du. Dann musst du aber natürlich auch dafür sorgen, dass du genug Buffer zur Verfügung hast.
Im Übrigen solltest du dann nicht einfach den neuen received_bytes-Wert über den alten schreiben, denn dann steht da vielleicht zuerst 1024 und dann 14, und das ist definitiv nicht gleich 1038. Außerdem gibt recv bei EOF eine Länge von 0 zurück; auch das solltest du berücksichtigen (von eventuellen Fehlercodes ganz zu schweigen).

freeze
22.10.2006, 15:56
Vielen Dank, hat funktioniert, falls es jemanden interessiert hier meine Lösung:


int Socket::recv (std::string& s) const {
char buf [MAXRECV + 1];
std::string buffer;

s = "";

memset (buf, 0, MAXRECV + 1);

// Read only the first buffer
int status = ::recv (m_sock, buf, MAXRECV, 0);
buffer = std::string(buf, status);
memset (buf, 0, MAXRECV + 1);

int new_status = 0;

// Convert the Buffer into a package structure
struct Package pkg = {0};
pkg = recvCmd(buffer);

// Save the actual status value
new_status = status;

// Calculate the needed size for the package
int needed_size = 0;
needed_size += sizeof(pkg.action);
needed_size += sizeof(pkg.host);
needed_size += sizeof(pkg.state);
if(pkg.action & MESSAGE) {
needed_size += sizeof(pkg.message_length);
needed_size += pkg.message_length;
}
else if(pkg.action & COMMAND) {
needed_size += sizeof(pkg.command);
}

// Receive the rest of the package
while(new_status != needed_size) {
if(new_status == needed_size)
break;

int state = ::recv (m_sock, buf, MAXRECV, 0);
if(state == -1) {
std::cout << "status == -1 errno == " << errno << " in Socket::recv\n";
return 0;
}
else if(state == 0) {
return 0;
}
buffer += std::string(buf, state);
memset (buf, 0, MAXRECV + 1);
new_status += state;
}

status = new_status;

if(status == -1) {
std::cout << "status == -1 errno == " << errno << " in Socket::recv\n";
return 0;
}
else if(status == 0) {
return 0;
}
else {
s = buffer; //std::string(buf, status);
return status;
}
}