私はちょうどこのスニペットを書きました:
#include <iostream>
#include <netdb.h>
#include <arpa/inet.h>
int main(void)
{
sockaddr_in self;
hostent *he;
char local[HOST_NAME_MAX];
gethostname(local, sizeof(local));
he = gethostbyname(local);
if (he)
{
std::cout << "Addresses: " << std::endl;
unsigned int i = 0;
while(he->h_addr_list[i] != NULL)
{
std::cout << "\t" << i << " --> ";
memcpy(&self.sin_addr, he->h_addr_list[i], he->h_length);
std::cout << self.sin_addr.s_addr;
std::cout << " ( " << inet_ntoa( *( struct in_addr*)( he-> h_addr_list[i])) << " )" << std::endl;
i++;
}
}
else
std::cout << "gethostname failed" << std::endl;
}
サンプルホストで実行すると、次のような結果が得られます(ただし、これらのアドレスはここで作成しました):
アドレス: 0 --> 1307150150 (10.23.215.61)
一方、実行するifconfig
と、はるかに多くの出力が得られます。特に、上記のアドレスは、最初に表示されたインターフェイスのifconfig
前に少なくとも 2 つある場合にのみ対応しeth0
ます。どうして?これが、このホストで可能なすべてのネットワークアドレスを通過すると予想していました...
以下の回答の後、次のことを行いました(getaddrinfoを使用):
int main(void)
{
struct addrinfo *result;
struct addrinfo *res;
int error;
char local[HOST_NAME_MAX];
gethostname(local, sizeof(local));
error = getaddrinfo(local, NULL, NULL, &result);
if (error != 0)
{
fprintf(stderr, "error in getaddrinfo: %s\n", gai_strerror(error));
return 1;
}
for (res = result; res != NULL; res = res->ai_next)
{
struct in_addr addr;
addr.s_addr = ((struct sockaddr_in *)(res->ai_addr))->sin_addr.s_addr;
std::cout << addr.s_addr
<< " ("
<< inet_ntoa(addr)
<< " )"
<< std::endl;
}
freeaddrinfo(result);
}
「正しい」回数を繰り返したことを除いて、以前と同じ出力が得られます。(つまり、ifconfig から、おそらくマルチキャストで送信できる 3 つのインターフェイスが表示され、上記の出力として 3 回繰り返される最初のインターフェイスの inet アドレスが取得されます。