Is there an alternative to inet_ntop / InetNtop in Windows XP?
I'm trying to compile beej's guide to network programming examples, but Windows XP doesn't have such a function. I'm 开发者_JS百科using mingw, if it makes any difference.
From the WinSock layer:
WSAAddressToString
(ntop)WSAStringToAddress
(pton)
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.
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)
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;
}
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)
精彩评论