sve*_*ven 7 c sockets inet-aton
我有inet_aton转换网络地址的问题.下面的代码可以很好地转换地址10.0.0.1
char *x1;
struct sockaddr_in si_other;
inet_aton("10.0.0.1", &si_other.sin_addr);
printf("si_other.sin_addr =%lu\n",si_other.sin_addr);
x1 = inet_ntoa(si_other.sin_addr);
printf("x1=%s\n",x1);
Run Code Online (Sandbox Code Playgroud)
它输出:
si_other.sin_addr =16777226
x1=10.0.0.01
Run Code Online (Sandbox Code Playgroud)
到目前为止没问题.但是,该函数在010.000.000.001传递时会起作用
char *x2;
struct sockaddr_in si_other2;
inet_aton("010.000.000.001", &si_other2.sin_addr);
printf("si_other2.sin_addr =%lu\n",si_other2.sin_addr);
x2 = inet_ntoa(si_other2.sin_addr);
printf("x2=%s\n",x2);
Run Code Online (Sandbox Code Playgroud)
输出:
si_other.sin_addr2 =16777224
x2=8.0.0.01
Run Code Online (Sandbox Code Playgroud)
当该功能正常工作192.168.0.1和192.168.000.001传递.
任何人都可以解释我的问题是什么以及如何解决问题?(注意:我需要传递010.000.000.001我的代码中的IP地址)
Fle*_*exo 12
前导0被解释为指示数字是八进制.010(oct)== 8(dec).您需要修改输入以inet_aton避免这种情况,或者以不同的方式自行转换.
const char *str = "010.000.000.001";
inet_aton(str[0] == '0' ? str+1:str, &si_other.sin_addr);
Run Code Online (Sandbox Code Playgroud)
是最简单的解决方案,但最好修复一下(snprintf?)首先产生字符串以避免混淆.
(因为它的解决方案不适用于许多边缘情况,包括"001.0.0.1","0xF.0.0.1","1"以及更多有效的IPv4收件人).
sscanf即使你无法控制它的生成方式,你也可以简单地"标准化"你的输入(尽管在我的视图中它确实应该是一个错误):
#include <stdio.h>
#include <stdlib.h>
int main() {
const char *str="010.020.030.040";
int parts[4];
sscanf(str, "%d.%d.%d.%d", parts+0, parts+1, parts+2, parts+3);
char *out = NULL;
asprintf(&out, "%d.%d.%d.%d", parts[0], parts[1], parts[2], parts[3]);
printf("%s\n", out);
free(out);
return 0;
}
Run Code Online (Sandbox Code Playgroud)