C 将此IP解析为正确的长度?
对于我正在做的事情,我希望获得运行C语言编写的程序的PC的外部IP。到目前为止,我发现最好的方法是连接到一个只显示访问者IP的站点,然后解析该IP的网页。第一部分很简单,但当我显示缓冲区时,我读取的页面只明显由我的IP组成,我在IP之后得到一些随机的额外符号/字符。下面是我用来排除其他东西的代码:C 将此IP解析为正确的长度?,c,winapi,ip,C,Winapi,Ip,对于我正在做的事情,我希望获得运行C语言编写的程序的PC的外部IP。到目前为止,我发现最好的方法是连接到一个只显示访问者IP的站点,然后解析该IP的网页。第一部分很简单,但当我显示缓冲区时,我读取的页面只明显由我的IP组成,我在IP之后得到一些随机的额外符号/字符。下面是我用来排除其他东西的代码: HINTERNET OpenInternet = NULL; HINTERNET GetIP = NULL; DWORD BytesRead = 0; char IPGrabbed[30]; Ope
HINTERNET OpenInternet = NULL;
HINTERNET GetIP = NULL;
DWORD BytesRead = 0;
char IPGrabbed[30];
OpenInternet = InternetOpen("Microsoft Internet Explorer", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if (OpenInternet == NULL) {
return 1;
}
GetIP = InternetOpenUrl(OpenInternet, "http://api.externalip.net/ip/", NULL, 0, INTERNET_FLAG_RELOAD, 0);
if (GetIP == NULL)
return 1;
if (!InternetReadFile(GetIP, &IPGrabbed, sizeof(IPGrabbed), &BytesRead))
return 1;
printf("IP: %s", IPGrabbed);
getchar();
我还尝试通过IPF解析,在任何“\n”或“\r”处停止,因为当我打印它时,它会在IP下方的行上显示奇怪的字符,然后将所有内容复制到另一个字符数组,但得到了相同的结果。有人能帮我弄清楚这是怎么回事吗?谢谢。InternetReadFile的结果不是以null结尾的,您需要在读取成功后通过代码在字符串末尾添加一个null字符:
IPGrabbed[BytesRead] = 0;
编辑1
正如Jonathan Potter在评论中所建议的,如果访问的站点返回的IP字符串长度超过最大16个字符,则上述代码可能会出现缓冲区溢出错误。
建议将InternetReadFile更改为读取的缓冲区长度减少1,而不是整个缓冲区长度,以消除上述问题
InternetReadFile(GetIP, &IPGrabbed, sizeof(IPGrabbed)-1, &BytesRead)
将缓冲区初始化为所有0,然后读取比要读取的缓冲区少一个字符 通过这种方式隐式提供C字符串所依赖的0终止符
char IPGrabbed[30] = ""; /* Initialise the buffer to all `0`s ... */
[...]
/* ... and then read one character less then the buffer to read into provides. */
if (!InternetReadFile(GetIP, &IPGrabbed, sizeof(IPGrabbed) - 1, &BytesRead))
return 1;
fprintf(stderr, "IP: %s", IPGrabbed); /* Print to stderr, as it's not buffered so
everything appear immediately to the console. */
请输入和输出示例。如果BytesRead==sizeofIPGrabbed,则缓冲区溢出。@JonathanPotter,谢谢你的提示,你的建议正在被纳入答案中。谢谢,这在很大程度上解决了问题,但现在IP后面只显示了大量空白字符。当我读取char数组的strlen时,我得到了14,尽管它不是那么多。有没有办法找出IP后面的这些空白字符是什么?谢谢你的回答,现在看起来很明显了。@RobLennon:你希望它们是什么,然后是空白?我真的想知道如何才能知道这些字符是什么,这样我就可以截断那里的字符串,但我知道了我们的方法。我只是设置了一个for循环,它遍历IP的每个字符,如果既不是数字也不是句点,它就知道IP真正结束的位置。谢谢。@RobLennon:不客气,我很高兴看到我已经回答了你的问题。如果你甚至喜欢我的答案,你也可以随意投票-