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); // 后续业务逻辑... }
原代码的问题说明
- 字符串操作逻辑错误:你尝试通过移位补零的思路不成立,比如
dotcount[0] - dotcount[1]得到的是负数,不可能等于4,逻辑完全错误 - 越界风险:循环
i <= 16会访问Ip_Address[16],超出数组的16字节范围(索引应为0-15) - 线程安全隐患:
inet_ntoa()返回静态缓冲区,多线程环境下可能被覆盖,直接用数值转换更可靠
内容的提问来源于stack exchange,提问作者Lieu
相关产品推荐
相关产品推荐

