2014-07-21 31 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

相關問題