2014-07-21 6 views
-1

저는이 문제에 너무 지쳤습니다. 약 5 시간 동안 문제를 해결하려고했지만 여전히 문제를 찾기 위해 semm을 사용할 수 없습니다.Recv은 항상 1 바이트 이하를받습니다.

제 문제는 서버에서 IP를 보낼 때 클라이언트 쪽에서 항상 recv가 1 자릿수 감소하다는 것입니다. 그리고 서버가 항상 항상 1 개 번호없이 온 데이터와 올바른 데이터와 클라이언트 측에서 IP 주소의 오른쪽 액수를 전송하고 항상 서버 보내기 때문에 첫 번째입니다 :

192.168.0.101

클라이언트하면 나타납니다

92.168.0.101

중요한 점은 클라이언트의 이름은 항상 문제없이 수신된다는 것인데, IP 주소에서만 발생합니다.

은에 대해 자세히 살펴 :

서버 측 데이터 송신 [2 문자열을 - 첫 번째 클라이언트의 이름이고 두 번째는 자신의 IP ADRESS입니다] :

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

서버가 클라이언트 이름을 보낼 때을 문자열의 길이 +1로 보내서 종료하는 NULL 문자를 포함시킵니다. 그러나 std::string::length()에 의해 반환 된 값은 이 아니며에 NULL을 포함하므로 서버가 실제로 클라이언트에 종결 NULL을 보내지 않습니다. 클라이언트가 이름을 읽을 때 IP 주소의 첫 번째 문자를 이름의 끝 NULL로 읽지 만 클라이언트가 '\0'을 보내지 않고 '\0'을 사용하여 해당 바이트를 data_buffor으로 덮어 씁니다. .

+0

나는 그런 지체가있다 .... 고맙습니다 천 번 각하. – darekg11

+0

당신이 그것을 잡았을 때 보이지 않는 것이 쉽습니다. – Vinbot

+0

네가 맞다고 생각해. 나는 좋은 4 시간 동안 그 코드를 쳐다 보면서 그것을 찾지 못했지만 지금은 문제없이 일하고있다. 다시 한 번 감사드립니다. 편집 : 또한 자세한 내용은 Remy에게 감사드립니다. – darekg11