此问题与之前询问的获取本地计算机的IP地址 -Question 几乎相同.但是,我需要找到Linux机器的IP地址.
那么:我如何 - 在C++中以编程方式 - 检测运行我的应用程序的linux服务器的IP地址.服务器至少有两个IP地址,我需要一个特定的IP地址(给定网络中的一个(公共网络)).
我确信有一个简单的功能可以做到这一点 - 但在哪里?
为了让事情更清楚:
我需要找到外部IP地址来绑定我的应用程序.显然我也可以绑定到INADDR_ANY(实际上这就是我现在所做的).不过,我更愿意检测公共地址.
我正在尝试将MacOSX应用移植到Windows上,我遇到了getifaddrs的问题.基本上Windows不支持它.我正试图找到一种方法来重新实现它(对于AF_INET和AF_INET6),但Windows上的"等效"功能似乎与MacOSX支持完全不同.
有人曾经做过这种转换吗?如果是这样,有一个很好的方法我可以让Windows报告像MacOSX那样的界面信息吗?
背景:
我正在编写一个进行TCP/IP连接的守护进程.它将在具有多个(非环回)IP地址的计算机上运行.我希望用户能够在守护程序的配置文件中指定用于传出连接的IP地址,或者*使用all.
地址将用于轮换,每个连接从最近最少使用的IP地址发出.这种行为很重要,因为它*是"all"的替代品,因此在多台机器上运行的守护程序可以指向文件共享上的相同配置文件,并且每个守护程序都使用自己的一组IP地址.
问题:
如何获取机器可以传出(即连接到任何其他计算机)连接的所有IP地址列表?给定所有IP地址的列表,我将如何过滤掉环回地址?
我在C中,如果可能的话我只想使用POSIX,但守护进程可能只能在Linux机器上运行,所以我接受一个以Linux为中心的答案.
每个IP地址都可以在一个(可能是虚拟的)网络设备上使用,反之亦然,因此枚举网络设备和获取相关IP地址的方法也足够了,尽管我对此并不满意.(附带问题:甚至可以将多个IP地址与单个设备关联起来吗?多个设备下的相同IP怎么样?不重要.)
解决方案不足:
gethostname()/ gethostbyname()(作为这个问题).使用该方法,我只返回127.0.0.1(或Debian中的.1.1).我怀疑这是因为机器的主机名在hosts文件中,这就是gethostbyname()检查.(我相信这就是为什么在Debian中我总是得到127.0.1.1:Debian默认将localhost添加为127.0.0.1并将机器的主机名添加为127.0.1.1到hosts文件中,对吧?)我想要一个忽略hosts并给我一切的解决方案实际上在那里getaddrinfo()比gethostname()/ 更幸运了gethostbyname().它似乎受到同样问题的约束.我测试了这个,将机器的主机名和NULL服务(端口)传递给它; 文档说传递NULL主机名和NULL服务是非法的,这是通过测试来支持的.不知道怎么回答机器上的所有问题,但是我愿意接受这方面的建议.最后的编辑:我已经接受了卡斯基的答案给了他一个功劳,因为我指的是如何做到这一点的方向.我已经发布了自己的答案,列出了如果有其他人需要它的确切方法的源代码.
如何在 Windows 上用 C 语言获取本地机器的 IP 地址?我无法在以下代码中获取我机器的 IP 地址:
#include <ifaddrs.h>
#include <stdio.h>
int main()
{
struct ifaddrs *id;
int val;
val = getifaddrs(&id);
printf("Network Interface Name :- %s\n",id->ifa_name);
printf("Network Address of %s :- %d\n",id->ifa_name,id->ifa_addr);
printf("Network Data :- %d \n",id->ifa_data);
printf("Socket Data : -%c\n",id->ifa_addr->sa_data);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在编译时遇到错误:
致命错误 C1083:无法打开包含文件:“net/if.h”:没有这样的文件或目录。
我无法使用,#include <net/if.h>因为它仅在 Linux 上可用。
我正在用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;
Run Code Online (Sandbox Code Playgroud) c++ ×3
ip-address ×3
c ×2
sockets ×2
ip ×1
ipv4 ×1
ipv6 ×1
linux ×1
macos ×1
networking ×1
posix ×1
winapi ×1
windows ×1
windows-xp ×1