Windows XP 中是否有 inet_ntop / InetNtop 的替代方案?

发布于 2024-08-08 05:30:57 字数 70 浏览 2 评论 0原文

我正在尝试编译beej的网络编程示例指南,但是Windows XP没有这样的功能。我正在使用 mingw,如果有什么区别的话。

I'm trying to compile beej's guide to network programming examples, but Windows XP doesn't have such a function. I'm using mingw, if it makes any difference.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

绿光 2024-08-15 05:30:57

从 WinSock 层:

From the WinSock layer:

水波映月 2024-08-15 05:30:57

如果您仅处理 IPv4 地址,则可以使用 inet_ntoa。它可在 Windows 2000 或更高版本上使用。否则,您将必须需要 Vista 及更高版本,或者编写您自己的 inet_ntop 函数。

您还可以查看 boost - boost::asio 有一个可在 Windows 中运行的 inet_ntop 实现:boost::asio::detail::socket_ops::inet_ntop。您可以在此处查看源代码。

If you're only dealing with IPv4 addresses, you can use inet_ntoa. It's available on Windows 2000 or later. Otherwise you'll have to either require Vista and later, or write your own inet_ntop function.

You could also look at boost - the boost::asio has an inet_ntop implementation that works in Windows: boost::asio::detail::socket_ops::inet_ntop. You can see the source code here.

記憶穿過時間隧道 2024-08-15 05:30:57

POSIX 兼容的 libc for Windows (PlibC) 库中还有 inet_ntop 函数创建用于将 POSIX 应用程序移植到 Windows。 在线文档中没有关于它的注释,但它存在于文件 inet_ntop 中.c 至少自 2008 年起(根据文件日期)。

const char * inet_ntop(int af, const void *src, char *dst, size_t size)

There is also inet_ntop function in POSIX compliant libc for Windows (PlibC) library that was created for porting POSIX applications to Windows. There is no notes about it in online documentation, but it exists in file inet_ntop.c at least since 2008 (according to file date).

const char * inet_ntop(int af, const void *src, char *dst, size_t size)
脱离于你 2024-08-15 05:30:57

您可能想使用 Jeroen Massar 此处,他的帖子摘录如下:

const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt)
{
    if (af == AF_INET)
    {
        struct sockaddr_in in;
        memset(&in, 0, sizeof(in));
        in.sin_family = AF_INET;
        memcpy(&in.sin_addr, src, sizeof(struct in_addr));
        getnameinfo((struct sockaddr *)&in, sizeof(struct
            sockaddr_in), dst, cnt, NULL, 0, NI_NUMERICHOST);
        return dst;
    }
    else if (af == AF_INET6)
    {
        struct sockaddr_in6 in;
        memset(&in, 0, sizeof(in));
        in.sin6_family = AF_INET6;
        memcpy(&in.sin6_addr, src, sizeof(struct in_addr6));
        getnameinfo((struct sockaddr *)&in, sizeof(struct
            sockaddr_in6), dst, cnt, NULL, 0, NI_NUMERICHOST);
        return dst;
    }
    return NULL;
}

You might want to use something Jeroen Massar provided here, excerpt from his post follows:

const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt)
{
    if (af == AF_INET)
    {
        struct sockaddr_in in;
        memset(&in, 0, sizeof(in));
        in.sin_family = AF_INET;
        memcpy(&in.sin_addr, src, sizeof(struct in_addr));
        getnameinfo((struct sockaddr *)&in, sizeof(struct
            sockaddr_in), dst, cnt, NULL, 0, NI_NUMERICHOST);
        return dst;
    }
    else if (af == AF_INET6)
    {
        struct sockaddr_in6 in;
        memset(&in, 0, sizeof(in));
        in.sin6_family = AF_INET6;
        memcpy(&in.sin6_addr, src, sizeof(struct in_addr6));
        getnameinfo((struct sockaddr *)&in, sizeof(struct
            sockaddr_in6), dst, cnt, NULL, 0, NI_NUMERICHOST);
        return dst;
    }
    return NULL;
}

︶葆Ⅱㄣ 2024-08-15 05:30:57

您可以在Windows 7上将winsocket与mingw-64一起使用

#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>

,链接

gcc showip.c -lws2_32

目标:x86_64-w64-mingw32
线程模型:win32
海湾合作委员会版本 6.3.0 (GCC)

you can use winsocket with mingw-64 on windows 7

#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>

linkwith

gcc showip.c -lws2_32

Target: x86_64-w64-mingw32
Thread model: win32
gcc version 6.3.0 (GCC)

桜花祭 2024-08-15 05:30:57

Xp Sp3中没有函数getnameinfo的头文件,因为它使用的是Vista最低的操作系统。我将其替换为以下方法,该方法仅适用于ipv4:

QString ipv4ToString(const in_addr& addr) {
    char ipstr[INET_ADDRSTRLEN];
    unsigned char* bytes = (unsigned char*)&addr;
    _snprintf(ipstr, INET_ADDRSTRLEN, "%u.%u.%u.%u", bytes[0], bytes[1], bytes[2], bytes[3]);
    return QString::fromLocal8Bit(ipstr);
}

There is no header file for the function getnameinfo in Xp Sp3 because it uses the lowest operating system of Vista. I will replace it with the following method, which is only applicable to ipv4:

QString ipv4ToString(const in_addr& addr) {
    char ipstr[INET_ADDRSTRLEN];
    unsigned char* bytes = (unsigned char*)&addr;
    _snprintf(ipstr, INET_ADDRSTRLEN, "%u.%u.%u.%u", bytes[0], bytes[1], bytes[2], bytes[3]);
    return QString::fromLocal8Bit(ipstr);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文