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

问题描述 投票:0回答:6

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

c++ windows networking
6个回答
10
投票

来自WinSock层:


7
投票

如果您只处理 IPv4 地址,则可以使用

inet_ntoa
。它可在 Windows 2000 或更高版本上使用。否则,您必须需要 Vista 及更高版本,或者编写您自己的 inet_ntop 函数。

您还可以查看 boost - boost::asio 有一个适用于 Windows 的

inet_ntop
实现:
boost::asio::detail::socket_ops::inet_ntop
。您可以在这里查看源代码。


3
投票

Windows 的 POSIX 兼容 libc (PlibC)

 库中还有 
inet_ntop 函数,该库是为将 POSIX 应用程序移植到 Windows 而创建的。 在线文档中没有关于它的注释,但它至少自 2008 年以来就存在于文件 inet_ntop.c
 中(根据文件日期)。 

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

2
投票
您可能想使用 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; }
    

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

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

链接

gcc showip.c -lws2_32

目标:x86_64-w64-mingw32 线程模型:win32 gcc 版本 6.3.0 (GCC)


0
投票
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); }
    
© www.soinside.com 2019 - 2024. All rights reserved.