对于我正在做的事情,我想获取运行程序(用 C 编写)的 PC 的外部 IP。到目前为止,我发现最好的方法是连接到一个仅显示访问者 IP 的网站,然后解析该 IP 的网页。第一部分很简单,但是当我显示缓冲区时,我读取了该页面(该页面仅明显包含我的 IP),我在 IP 后面得到了一些随机的额外符号/字符。这是我使用 ATM 的代码(经过简化以排除其他内容):
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();
我还尝试通过IPGrabbed进行解析,停在任何“\n”或“\r”处(因为当我 printf() 时,它会在 IP 下面的行上显示奇怪的字符),然后将所有内容复制到另一个char 数组,但得到相同的结果。谁能帮我弄清楚这里发生了什么事吗?谢谢。
最佳答案
将缓冲区初始化为全部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. */
关于c - 将此 IP 解析为正确的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20725593/