如何查找计算机的IP地址?

时间:2009-01-27 23:04:50

标签: c++ sockets ip-address

我正在用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;

6 个答案:

答案 0 :(得分:5)

  

我听说某个地方有电脑   可以有多个IP地址。我想要   其他节目的那个   不同的计算机可以用来连接   到电脑。

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

答案 1 :(得分:5)

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

这取决于您是否尝试获取LAN IP地址(即计算机集中的计算机地址)或服务提供商每次连接到Internet时提供的IP地址。后者可以用一个查询(我猜你会找到一个适当的C ++库,只需要用谷歌搜索)来识别某些IP检测Web服务。

如果你想要一个快速和肮脏的解决方案,你可以尝试wget http://www.whatismyip.org并回读内容。

答案 5 :(得分:0)

您可以使用light-weighted client/server socket class in C++项目作为参考。