为了两个主机之间的通信,我需要将我的主机IP地址发送到另一个站点。问题在于,如果我请求我的IP地址,可能会返回本地环回IP地址(127.x.x.x),而不是网络(以太网)IP地址。
我使用以下代码:
char myhostname[32];
gethostname(myhostname, 32);
hp = gethostbyname(myhostname);
unsigned my_ip = *(unsigned*)(hp->h_addr);
if( (my_ip % 256) == 127) {
/* Wrong IP adress as it's 127.x.x.x */
printf("Error, local IP address!");
return;
}
唯一的解决方法是确保我的主机名在/etc/hosts中位于真实网络地址之后,而不是本地环回地址(例如Ubuntu的默认设置)。
是否有一种方法可以在不依赖/etc/hosts内容的情况下解决这个问题?
编辑:我更改了上面的代码,所以它使用了getaddrinfo,但我仍然得到回送设备的编号(127.0,0,1),而不是真正的IP地址。
struct addrinfo hint = {0};
struct addrinfo *aip = NULL;
unsigned ip = 0;
struct sockaddr_in *sinp = NULL;
hint.ai_family = AF_INET; /* IPv4 */
hint.ai_socktype = SOCK_STREAM;
if(getaddrinfo(hostname, NULL, &hint, &aip) != 0) {
return 0;
}
sinp = (struct sockaddr_in *) aip->ai_addr;
ip = *(unsigned *) &sinp->sin_addr;
我曾经得到过一个包含三个addrinfo的列表,其中包括SOCK_STREAM、SOCK_DGRAM和SOCK_RAW,但提示信息阻止了这种情况。所以我的问题仍然存在...