You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中从unsigned char缓冲区取回socket传输的两个int值

如何在接收端取回socket发送的两个int值

发送端代码修正说明

你提供的发送端代码存在一个笔误:memcpy(request, &ind,4);中的ind应为index,否则无法通过编译。修正后的发送逻辑是将两个经htonl()转换为网络字节序的int值,依次写入8字节缓冲区。

接收端实现步骤

接收端需要反向操作:先完整接收缓冲区数据,再将数据还原为int并转换回主机字节序,具体代码如下:

  1. 分配接收缓冲区

    // 分配足够存储两个int的缓冲区(8字节)
    unsigned char *recv_buf = malloc(8 * sizeof(unsigned char));
    if (recv_buf == NULL) {
        // 处理内存分配失败
        return -1;
    }
    
  2. 完整接收数据
    网络传输中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;
    }
    
  3. 解析并转换字节序
    从缓冲区中拷贝数据到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);
    
  4. 释放缓冲区
    使用完内存后记得释放:

    free(recv_buf);
    

关键注意事项

  • 确保发送端和接收端的int类型宽度一致(均为4字节),跨架构通信建议使用uint32_t(需包含<stdint.h>)替代int,避免字节数差异导致解析错误。
  • 必须严格对应发送时的字节顺序:先写的index对应接收缓冲区的前4字节,后写的size对应后4字节,顺序不能颠倒。

内容的提问来源于stack exchange,提问作者Compte Inutile

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:05:25