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

C语言Socket TCP服务器:协议要求的IP格式匹配实现求助

解决方案:将IP转换为000.000.000.000格式

你的核心需求是把客户端IP地址转换成每段补前导零的固定格式,直接操作字符串容易出错,更可靠的方式是从IP的数值形式拆分字段,再格式化输出:

关键步骤

  • 从sockaddr_in中取出32位IP值,用ntohl()转换为主机字节序
  • 将32位IP拆分为四个8位十进制段(比如127.0.0.1对应127、0、0、1)
  • 使用snprintf()格式化每个段为三位带前导零的字符串,拼接成指定格式
  • 结果存入Ip_Address数组(刚好16字节:15个可见字符+1个结束符\0)

修正后的代码片段

struct UserData {
    char Ip_Address[16];
    char port[10];
    char strConnTime[30]; 
    char strCloseTime[30];
};
UserData m_user_list[10];

while(1)
{
    dlg->accept_sock = accept(dlg->server_sock, (SOCKADDR*)&dlg->accept_addr, &size);
    if (dlg->accept_sock == SOCKET_ERROR)
    {
        break;
    }

    // 转换IP为数值形式,拆分四个段
    uint32_t ip_addr = ntohl(dlg->accept_addr.sin_addr.s_addr);
    int seg1 = (ip_addr >> 24) & 0xFF;
    int seg2 = (ip_addr >> 16) & 0xFF;
    int seg3 = (ip_addr >> 8) & 0xFF;
    int seg4 = ip_addr & 0xFF;

    // 格式化为000.000.000.000格式,存入数组
    snprintf(m_user_list[index].Ip_Address, sizeof(m_user_list[index].Ip_Address),
             "%03d.%03d.%03d.%03d", seg1, seg2, seg3, seg4);

    // 后续业务逻辑...
}

原代码的问题说明

  1. 字符串操作逻辑错误:你尝试通过移位补零的思路不成立,比如dotcount[0] - dotcount[1]得到的是负数,不可能等于4,逻辑完全错误
  2. 越界风险:循环i <= 16会访问Ip_Address[16],超出数组的16字节范围(索引应为0-15)
  3. 线程安全隐患:inet_ntoa()返回静态缓冲区,多线程环境下可能被覆盖,直接用数值转换更可靠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:15:41