TCP点对点连接报错:IP地址赋值类型不匹配问题咨询
TCP P2P连接IP处理错误的解决方法
核心问题分析
- 类型不匹配错误:
serv_addr.sin_addr.s_addr的类型是in_addr_t(本质是无符号32位整数,存储网络字节序的IP地址),而你定义的ip是char数组(字符串形式的IP),直接赋值必然触发类型错误。 - 变量重复声明:代码里重复定义了
char ip[15];,这会导致编译错误,必须删除其中一条声明。
正确的IP地址处理方式
方法1:使用inet_pton(推荐,支持IPv4/IPv6且更安全)
inet_pton可以将字符串形式的IP地址转换为网络字节序的二进制整数,示例代码如下:
struct sockaddr_in serv_addr; memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; // 转换端口为网络字节序 serv_addr.sin_port = htons(PORT); // 转换IP地址 if (inet_pton(AF_INET, ip, &serv_addr.sin_addr) <= 0) { perror("无效的IP地址"); exit(EXIT_FAILURE); }
- 返回值大于0表示转换成功;等于0表示输入不是有效的IP地址;小于0表示函数调用出错。
方法2:使用inet_addr(已废弃,仅兼容旧代码)
如果是仅兼容IPv4的场景,也可以用inet_addr,但它在处理"255.255.255.255"时会返回错误值,不如inet_pton可靠:
serv_addr.sin_addr.s_addr = inet_addr(ip); if (serv_addr.sin_addr.s_addr == INADDR_NONE) { perror("无效的IP地址"); exit(EXIT_FAILURE); }
额外注意事项
- 端口号
PORT也需要转换为网络字节序,必须用htons()函数处理,否则跨端通信会出现端口不匹配的问题。 - 确保
ip数组的长度足够存储IPv4地址(最长为15字符,比如"255.255.255.255"),你的定义char ip[15];刚好满足,但如果要支持IPv6需要调整长度。
内容的提问来源于stack exchange,提问作者Dan Luke
相关产品推荐
相关产品推荐

