获取IP地址然后使用C ++将其转换为字节的最佳方法是什么?我需要一些跨平台的东西。我找到了很多,但我不知道什么是最好的技术。
答案 0 :(得分:4)
您可以使用gethostname后跟gethostbyname来获取本地接口内部IP。
您可以尝试以下代码:
struct IPv4
{
unsigned char b1, b2, b3, b4;
};
bool getMyIP(IPv4 & myIP)
{
char szBuffer[1024];
#ifdef WIN32
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(2, 0);
if(::WSAStartup(wVersionRequested, &wsaData) != 0)
return false;
#endif
if(gethostname(szBuffer, sizeof(szBuffer)) == SOCKET_ERROR)
{
#ifdef WIN32
WSACleanup();
#endif
return false;
}
struct hostent *host = gethostbyname(szBuffer);
if(host == NULL)
{
#ifdef WIN32
WSACleanup();
#endif
return false;
}
//Obtain the computer's IP
myIP.b1 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b1;
myIP.b2 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b2;
myIP.b3 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b3;
myIP.b4 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b4;
#ifdef WIN32
WSACleanup();
#endif
return true;
}
使用htonl,htons,ntohl,ntohs函数在网络和本地字节顺序之间进行转换。
答案 1 :(得分:1)
在C ++中没有标准的方法可以做到这一点,因为C ++也可以在没有网络的系统上运行。
每个操作系统都有不同的查询本地接口地址的方法。您希望找到的最“便携”的东西是一个库,它提供与所有主要操作系统相对应的底层实现的单一一致接口。
答案 2 :(得分:1)
正如Ben所说,您可以使用具有许多操作系统实现的非标准库。 绝不是提升银弹,但是增强型asio库是一个非常有用,设计良好的便携式网络库,可以实现许多操作系统。特别是asio提供了ip::host_name方法。
答案 3 :(得分:0)
可用于将IP转换为字符串的两种方法是inet_ntoa(仅限IPv4)或带有NI_NUMERICHOST标志(IPv4和IPv6)的getnameinfo。