2 つのホスト間の通信のために、ホストの IP アドレスを他のサイトに送信する必要があります。問題は、IP アドレスを要求すると、ネットワーク (イーサネット) IP アドレスではなく、ローカル ループバック IP アドレス (127.xxx) が返される可能性があることです。
次のコードを使用します。
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 を使用するように上記のコードを変更しましたが、実際の IP アドレスの代わりにループバック デバイスの番号 (127.0,0,1) が返されます。
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;
(以前は 3 つの addrinfo のリストを 3 つの SOCK_STREAM、SOCK_DGRAM、SOCK_RAW で取得していましたが、ヒントによってそれが妨げられています)
だから私の質問はまだ残っています...