1

我正在用 C++ 编写一个使用网络套接字的程序。我需要找出计算机的 IP 地址是什么,以便将其显示给用户。该程序必须在 Windows 和 Linux 上运行。

我在某处听说一台计算机可以有多个 IP 地址。我想要不同计算机上的其他程序可以用来连接到计算机的那个。

这是我已经拥有的相关代码(变量在其他地方声明):

master = new fd_set;
FD_ZERO(master);
struct sockaddr_in my_addr;

listener = socket(PF_INET, SOCK_STREAM, 0);

my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(port);
my_addr.sin_addr.s_addr = INADDR_ANY;
memset(my_addr.sin_zero, '\0', sizeof my_addr.sin_zero);

bind(listener, (struct sockaddr *)&my_addr, sizeof my_addr);

listen(listener, 10);

FD_SET(listener, master);

fdmax = listener;
4

6 回答 6

5

我在某处听说一台计算机可以有多个 IP 地址。我想要不同计算机上的其他程序可以用来连接到计算机的那个。

嗯……那可能是他们中的任何一个。如果一台计算机有多个 IP 地址,则可以在其中任何一个上访问它。当然,其中一个可能受制于不同的防火墙规则,或者它们可能位于两个完全不同的网段上,但无法检测到所有这些情况。

于 2009-01-27T23:07:27.993 回答
5

我发布了一个类似的问题,但最近在 OS X 上。我收到的答案是使用 0.0.0.0 或 INADDR_ANY。这将导致您的套接字侦听所有可用地址,因此您无需确定哪个是“正确的”地址。

于 2009-01-27T23:32:04.777 回答
4

在 Windows 上,您想使用GetAdaptersAddresses - 这会列出您机器中的所有适配器以及绑定到它们的 IP 地址。它也支持 IPv6 地址。您也可以使用gethostbyname,但这不支持 IPv6。

在 Linux 上,我们读取/proc/net/dev/proc/net/if_inet6解析结果。

于 2009-01-27T23:34:18.440 回答
2

我相信您可以将 getaddrinfo() 与您的侦听器套接字一起使用,以获取您绑定到的套接字的 IP 地址。

于 2009-01-27T23:17:59.487 回答
0

这取决于您是想获取您的 LAN IP 地址(即您的计算机在您的计算机组中的地址)还是您的服务提供商在您每次连接到 Internet 时提供给您的 IP 地址。后者可以通过对某些 IP 检测 Web 服务的查询(我猜你会找到一个适当的 C++ 库,只需很少的谷歌搜索就可以做到这一点)来识别。

如果您想要一个快速而肮脏的解决方案,您可以尝试访问http://www.whatismyip.org并阅读内容。

于 2009-01-27T23:15:22.317 回答
0

您可以使用C++项目中的轻量级客户端/服务器套接字类进行参考。

于 2009-01-28T06:07:11.970 回答