C语言中从unsigned char缓冲区取回socket传输的两个int值
如何在接收端取回socket发送的两个int值
发送端代码修正说明
你提供的发送端代码存在一个笔误:memcpy(request, &ind,4);中的ind应为index,否则无法通过编译。修正后的发送逻辑是将两个经htonl()转换为网络字节序的int值,依次写入8字节缓冲区。
接收端实现步骤
接收端需要反向操作:先完整接收缓冲区数据,再将数据还原为int并转换回主机字节序,具体代码如下:
分配接收缓冲区
// 分配足够存储两个int的缓冲区(8字节) unsigned char *recv_buf = malloc(8 * sizeof(unsigned char)); if (recv_buf == NULL) { // 处理内存分配失败 return -1; }完整接收数据
网络传输中recv()可能无法一次性获取全部数据,需循环接收直至收满8字节:int sockfd; // 假设这是已连接的socket描述符 ssize_t total_recv = 0; ssize_t recv_len; while (total_recv < 8) { recv_len = recv(sockfd, recv_buf + total_recv, 8 - total_recv, 0); if (recv_len <= 0) { // 处理接收错误或连接断开 free(recv_buf); return -1; } total_recv += recv_len; }解析并转换字节序
从缓冲区中拷贝数据到int变量,再用ntohl()将网络字节序转回主机字节序:int received_index, received_size; // 解析第一个int(前4字节) memcpy(&received_index, recv_buf, 4); received_index = ntohl(received_index); // 解析第二个int(后4字节) memcpy(&received_size, recv_buf + 4, 4); received_size = ntohl(received_size);释放缓冲区
使用完内存后记得释放:free(recv_buf);
关键注意事项
- 确保发送端和接收端的
int类型宽度一致(均为4字节),跨架构通信建议使用uint32_t(需包含<stdint.h>)替代int,避免字节数差异导致解析错误。 - 必须严格对应发送时的字节顺序:先写的
index对应接收缓冲区的前4字节,后写的size对应后4字节,顺序不能颠倒。
内容的提问来源于stack exchange,提问作者Compte Inutile
相关产品推荐
相关产品推荐

