![]() |
1
31
这个问题比看起来更棘手,因为在许多情况下,没有“本地计算机的IP地址”而是有许多不同的IP地址。例如,我现在正在输入的mac(这是一个非常基本的标准mac设置)有以下相关的ip地址:
…这不仅仅是找出上面哪一个是“真正的IP地址”的问题,或者…它们都是“真实的”和有用的;有些比其他更有用,这取决于您将使用这些地址的用途。 根据我的经验,为本地计算机获取“IP地址”的最佳方法通常不是查询本地计算机,而是询问您的程序正在与它所看到的计算机的IP地址进行通信的计算机。例如,如果您正在编写客户端程序,请向服务器发送一条消息,要求服务器将您的请求所来自的IP地址作为数据发送回去。这样你就会知道 相关的 IP地址是,给定与您通信的计算机的上下文。 也就是说,这个技巧可能不适合某些目的(例如,当你不与特定计算机通信时),因此有时你只需要收集与你的计算机相关联的所有IP地址的列表。在unix/mac(afaik)下,最好的方法是调用getifaddrs()并迭代结果。在windows下,尝试getadaptersaddresses()以获得类似的功能。例如,两者的用法,请参见中的getNetworkInterfaceInfos()函数 this file . |
![]() |
2
23
基于gethostbyname的所有方法的问题是,您无法获得分配给特定计算机的所有IP地址。服务器通常有多个适配器。 下面是一个示例,说明如何在主机上迭代所有IPv4和IPv6地址:
|
![]() |
3
16
您可以使用GethOSTNEX然后使用GeTHOSTBYNAMY来获得本地接口内部IP。 但是,这个返回的IP可能与您的外部IP不同。要获取外部IP,您必须与外部服务器通信,该服务器将告诉您外部IP是什么。因为外部IP不是你的,而是你的路由器。
您也可以总是使用127.0.0.1,它始终代表本地机器。 Windows中的子网掩码: 您可以通过查询注册表项的子键来获得子网掩码(和网关和其他信息): hkey_local_machine\system\currentcontrolset\services\tcpip\parameters\interfaces公司 查找注册表值subnetmask。 在Windows中获取接口信息的其他方法: 您还可以使用以下方法检索要查找的信息: WSAIoctl 使用此选项:sio_get_interface_list |
![]() |
4
7
在标准C++中不能这样做。我发这个是因为这是唯一正确的答案。你的问题问如何在C++中完成。嗯,你不能用C++来做。你可以在Windows,POSIX,Linux,Android,但所有这些都是 操作系统特定解决方案 不是语言标准的一部分。 标准C++ 没有网络层 完全。 我假设您有错误的假设,C++标准定义了与其他语言标准Java相同的特征范围。虽然Java可能在语言自身的标准库中有内置的网络(甚至GUI框架),但是C++没有。 虽然有第三方API和库可以由C++程序使用,但这与在C++中可以做到这一点完全不同。
这里有一个例子来说明我的意思。你可以在C++中打开一个文件,因为它有一个
|
![]() |
5
4
另外,请注意,“本地IP”可能不是一个特别独特的东西。如果你在几个物理网络上(例如,有线+无线+蓝牙,或者有大量以太网卡等的服务器),或者有TAP / DSP接口,你的机器可以很容易地拥有一大堆的接口。 |
![]() |
6
3
|
![]() |
7
2
Winsock特定:
|
![]() |
8
2
至于问题的子网部分,没有平台无关的方法来检索子网掩码,因为posix socket api(所有现代操作系统都实现了这个api)没有指定这一点。因此,您必须使用平台上可用的任何方法。 |
![]() |
9
1
我可以使用下面的代码在VS2013下使用DNS服务:
我不得不在链接器选项中添加dnsapi.lib作为成瘾依赖项。 参考文献 here . |
![]() |
10
0
你就不能送去吗? INADDR_BROADCAST ?不可否认,这将在所有接口上发送-但这很少是一个问题。 否则,ioctl和siocgiffrdaddr会在*nix上给你地址,并且 WSAioctl and SIO_GET_BROADCAST_ADDRESS 在Win32上。 |
![]() |
11
0
在DEV C++中,我用Win32使用纯C,用这个给定的代码:
当我点击“显示IP”按钮时,它就工作了。但第二次,程序退出(没有警告或错误)。当我这样做的时候:
即使以最快的速度多次单击同一个按钮,程序也不会退出。 因此wsacleanup()在dev-c++中可能不能很好地工作。 |
![]() |
12
0
我建议使用我的代码。
|
![]() |
Ian Newson · 协议缓冲区、C#和网络流:永远不会收到消息 2 年前 |
![]() |
Evantoki Alfa · 线程“main”java中出现异常。lang.ArrayIndexOutOfBoundsException:演示时为0。查找。main(Lookup.java:19) 2 年前 |
![]() |
ê¹ì¼í · 如何发送带有引号的关键数据的POST方法? 2 年前 |
![]() |
TiDu · 使用EKS设置出口网关的最简单方法,无需Istio 2 年前 |
![]() |
Nop · 无法关闭键盘中断(Python)上的套接字连接 2 年前 |