2012-05-29 3 views
4

서버에 보내는 방법 4 바이트 int 및 서버 측에서이 버퍼를 int로 변환하십시오.int를 보내고받는 C++

클라이언트 측 :

void send_my_id() 
{ 
int my_id = 1233; 
char data_to_send[4]; 
// how to convert my_id to data_send? 
send(sock, (const char*)data_to_send, 4, 0); 
} 

서버 측 : 송신 측에서

void receive_id() 
{ 
int client_id; 
char buffer[4]; 
recv(client_sock, buffer, 4, 0); 
// how to conver buffer to client_id? it must be 1233; 
} 
+1

수신에 대해서는 atoi, 송신에는 어떻게됩니까? – Almo

+0

예 - 문자 보내기/받기도 가능합니다. – paulsm4

답변

10

int의 주소를 char*으로 전송하고 send/recv으로 전달할 수 있습니다. 엔디안을 처리하려면 htonlntohl을 사용합니다.

void send_my_id() 
{ 
int my_id = 1233; 
int my_net_id = htonl(my_id); 
send(sock, (const char*)&my_net_id, 4, 0); 
} 

void receive_id() 
{ 
int my_net_id; 
int client_id; 
recv(client_sock, &my_net_id, 4, 0); 
client_id = ntohl(my_net_id); 
} 

참고 : 나는 결과 검사의 부족을 보존했다. 실제로 send와 recv가 모두 필요한 바이트를 모두 전송할 수 있도록 추가 코드가 필요합니다.

+0

@MooingDuck 감사합니다. –

0

:

int my_id = 1233; 
char data_to_send[4]; 
memcpy(&data_to_send, &my_id, sizeof(my_id)); 
send(sock, (const char*)data_to_send, 4, 0); 

수신 측에서 :

int client_id; 
char buffer[4]; 
recv(client_sock, buffer, 4, 0); 
memcpy(&my_id, &buffer, sizeof(my_id)); 

NB : 크기가 int이고 양쪽의 엔디안이 동일해야합니다.

+3

"endianness"*가 동일하지 않으면, 당신은 * ntohl()과 친구가 필요합니다. 가장 좋은 정책은 ntohl()을 절대적으로 필요로하든 그렇지 않든 단순히 사용하는 것입니다. 단지 좋은 습관 일뿐입니다. IMHO ... – paulsm4

+0

... 더 좋은 습관 이상의 것이 좋습니다. IMHO 당신은 야생에서 위의 코드로 오랫동안 살아남지 못할 것입니다 (말장난 의도). –

2

인터넷 시작 이후 일반적인 규칙은 이진 정수를 Network Byte Order (빅 엔디안 읽기)로 전송하는 것이 었습니다. 당신은 htonl(3)와 친구들을 사용하여 그렇게 할 수 있습니다.

관련 문제