c - 将此 IP 解析为正确的长度?

标签 c winapi ip

对于我正在做的事情,我想获取运行程序(用 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/

相关文章:

c++ - 是否可以使静态控件透明?

flutter - 如何使用 flutter 扫描本地网络上的所有设备

node.js - 如何在 NodeJS 中使用 http 模块在同一端口上打开 IPv4 和 IPv6 套接字?

C "printf"Linux 和 Mac 输出不同

c - 有没有8051汇编语言到C代码的转换器

c - 包含 SDL 的 Makefile

c++ - 获取 Windows 启动消息的语言

c++ - 在 C++ 中初始化 C 结构

c++ - Win32API : How to request embedded windows event notifications out to a parent window

node.js - 亚马逊 ELB 后面带有 node-js 的远程 IP 地址