2012-05-29 109 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如何接收,itoa如何发送? – 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)); 

注意:大小为int,并且endianness必须在两边相同。

+3

如果“排列顺序”*不相同,那么你*需要* ntohl()和朋友。最好的策略是简单地使用ntohl(),不管你是否绝对需要它 - 这只是一个好习惯。恕我直言... – paulsm4

+0

...更好,它不仅仅是一个好习惯。恕我直言,你将无法长期与野生上述代码(双关语意图)生存。 –

2

自互联网开始以来的惯例是发送Network Byte Order(阅读big-endian)中的二进制整数。你可以使用htonl(3)和朋友来做到这一点。