2014-07-21 30 views
-1

我对此非常厌烦 - 我试图修复它大约5个小时,我仍然不能找到问题,也许你们可以。Recv总是收到1个字节

我的问题是,当我从服务器发送IP时,recv在客户端总是recv少一个字节。而服务器始终发送数据和右数据,并在客户端IP地址的正确ammount的总是悄无1号,它总是第一个这样的服务器发送:

192.168.0.101

客户接受:

92.168.0.101

还有一点很重要的是客户的名字总是没有任何问题地被接收到 - 它只发生在IP地址上。

在那仔细看看:

服务器端发送数据[2串 - 首先是客户端的名称,第二个是他的IP地址]:

j是列表的迭代循环thourght所有客户端和客户端变量是被要求的所有客户端的数据

std::cout << j->client_name << " "; 
int lenght = j->client_name.length()+1 ; //+1 for '\0' byte at the client buffer 
std::cout << "Lenght (+1): " << lenght << " "; 
lenght = htonl(lenght); //change byte order to network 
send(client->client_socket,(char*)&lenght,sizeof(int),0); 
std::cout << "I have sent: " << send(client->client_socket,j->client_name.c_str(),j->client_name.length(),0) << std::endl; 
std::cout << inet_ntoa(j->client_connection.sin_addr) << " "; //showing IP adress 
unsigned lenght2 = strlen(inet_ntoa(j->client_connection.sin_addr))+1; //+1 for '\0' byte at the client buffer 
std::cout << "Lenght (+1): " << lenght2 << " "; 
unsigned realistic_lenght = lenght2; 
lenght2 = htonl(lenght2); 
send(client->client_socket,(char*)&lenght,sizeof(unsigned),0); 
std::cout << "I have sent: " << send(client->client_socket,inet_ntoa(j->client_connection.sin_addr),realistic_lenght,0) << std::endl; 

正如我在服务器端的一切说似乎是好的,这里的代码,即可获得在客户端的数据之一:

char* data_buffor; 
int lenght = 0; 
recv(data.client_socket,(char*)&lenght,sizeof(int),0); 
lenght = ntohl(lenght); 
std::cout << "I have received: " << lenght << std::endl; 
data_buffor = new char[lenght]; 
if (data_buffor != NULL) std::cout << "ALLOCATION WAS SUCCESFULL" << std::endl; 
std::cout << "I have received: " << recv(data.client_socket,data_buffor,lenght,0) << std::endl; 
data_buffor[lenght-1] = '\0'; 
temp.client_name = data_buffor; // everything is fine here 
delete data_buffor; 
data_buffor = NULL; 
unsigned lenght2 = 0; 
recv(data.client_socket,(char*)&lenght2,sizeof(unsigned),0); 
lenght2 = ntohl(lenght2); 
std::cout << "I have received: " << lenght2 << std::endl; // I DONT KNOW WHY BUT HERE I GET CRAZY NUMBERS LIKE 3203 and I should get 14 with IP: 192.168.0.101 + one byte for '\0' I think that may be causing all problems but I have no idea how to fix it. 
data_buffor = new char[lenght2]; 
if (data_buffor != NULL) std::cout << "ALLOCATION WAS SUCCESFULL" << std::endl; 
std::cout << "I have received " << recv(data.client_socket,data_buffor,lenght2,0) << std::endl; 
temp.client_ip_adress = data_buffor; 
all_clients.push_back(temp); 
delete data_buffor 
data_buffor = NULL; 

任何帮助将不胜感激。

+2

请格式化这个邪恶的生物。 – deW1

+1

您已验证服务器实际上使用Wireshark等网络分析器发送了什么内容? –

回答

2

当服务器发送客户端名称时,它发送length作为字符串+ 1的长度以包含终止NULL字符。但是,由std::string::length()返回的值确实是而不是包含终止空值,因此服务器实际上并未将终止空值发送给客户端。当客户端读取名称时,它会读取IP地址的第一个字符作为名称的终止NULL,但您永远不会注意到,因为客户端将使用'\0'覆盖data_buffor中的该字节,而不是依靠服务器发送'\0'

+0

我是这样一个延迟.... 谢谢你千次先生。 – darekg11

+0

很容易看不清你什么时候被抓到了 – Vinbot

+0

是的,我想你是对的 - 我一直在盯着那些好的4个小时的代码,找不到它,但现在它的工作没有问题。 再次感谢。 编辑:也感谢雷米更深入的解释。 – darekg11

相关问题