【问题标题】:Get IP input from user and validate WINAPI从用户获取 IP 输入并验证 WINAPI
【发布时间】:2016-10-13 03:31:24
【问题描述】:

如何获取用户在 Winapi 中的 IP 控制框中插入的 IP,以便在之后验证它?

已经尝试过 GetDlgItem() 但它似乎没有以正确的格式存储 IP,也许我做错了。我将其存储为 DWORD。

有什么建议吗?

【问题讨论】:

    标签: c winapi ip


    【解决方案1】:

    您通过发送IPM_GETADDRESS 消息从IP Address Control 检索IP 地址1)

    DWORD dwAddr = 0x0;
    SendMessage(hWndIpAddr, IPM_GETADDRESS, 0, (LPARAM)&dwAddr);
    

    返回时,DWORD 包含 IP 地址,其中 MSB 存储第一个八位字节,而 LSB 存储第四个八位字节。您可以像这样以人类可读的格式输出地址:

    printf("%u.%u.%u.%u\n", (dwAddr >> 24) & 0xff,
                            (dwAddr >> 16) & 0xff,
                            (dwAddr >>  8) & 0xff,
                            (dwAddr      ) & 0xff);
    

    或者,使用FIRST_IPADDRESSSECOND_IPADDRESSTHIRD_IPADDRESSFOURTH_IPADDRESS 宏来提取地址信息:

    printf("%u.%u.%u.%u\n", FIRST_IPADDRESS(dwAddr), SECOND_IPADDRESS(dwAddr),
                            THIRD_IPADDRESS(dwAddr), FOURTH_IPADDRESS(dwAddr));
    


    1)由于地址以打包形式返回为DWORD,因此无需验证它,因为任何DWORD(如果解释为 IPv4 地址的 4 个部分) ) 是一个有效的地址。

    【讨论】:

    • 有用于从DWORD中提取各个组件的宏:FIRST_IPADDRESS()SECOND_IPADDRESS()
    【解决方案2】:

    正如 IInspectable 所指出的,一种方法是发送 IPM_GETADDRESS 消息,但第二种也是最简单的方法是调用 GetWindowText。这将删除不必要的 printf。

    WCHAR wAddress[64] = {0};
    GetWindowTextW(hWndIpAddr, wAddress, 32);
    

    【讨论】:

    • 我使用printf 来说明如何从DWORD 中提取单个信息。这不是必需的。现在,如果您检索文本表示,您将不得不解析出令牌以将其存储到 sockaddr 中,例如。这确实是常见的用例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    相关资源
    最近更新 更多