2

ローカルマシンのすべてのIPアドレスを移植可能に(WindowsとLinuxで)見つけようとしています。私が使用している方法は、最初にgethostname()を呼び出し、次にその結果をgethostbyname()に渡すことです。これにより、IPアドレスの配列が返されます。

問題は、Linuxでは、返されるアドレスは127.0.0.1だけであるということです。これはWindowsで機能しますが、ネットワークがDHCPで構成されている場合、Linuxでは機能しないと言う人が何人かいます(それが本当のことかどうかはわかりません)。

これはLinuxでこれを行う正しい方法ではありませんか?

4

2 に答える 2

1

これは、ほとんどのディストリビューションでこれが次の場所にあるために発生します/etc/hosts

127.0.0.1       localhost.localdomain   localhost aiur

gethostbynameホスト名(aiureこの例では)をアドレスに解決するだけです。それがそれを見つけたら、/etc/hostsそれをあなたに与えることはとても幸せです。

質問に戻ります。残念ながら、ポータブルな方法でマシンのすべてのアドレスを取得できるとは思いません。のように、Unixで移植可能な方法でそれを行うことができますifconfig。ソケットsを開き、を実行しioctl(..., SIOCGIFCONF, ...)ます。

ちなみに、kernel.orgを信じている場合gethostbyname廃止され、MSDNを信じている場合は非推奨になります。

于 2011-06-02T21:02:54.813 に答える
1

これは、unix/linuxでは正しい方法ではありません。正しい方法では、ioctlが必要な情報を取得します。

struct ifreq ifc_buffer[MAX_NUM_IFREQ];
ioctl(s, SIOCGIFCONF, &ifc)  # Interface list
num_ifreq = ifc.ifc_len / sizeof(struct ifreq);
for(cnt=0;cnt<num_ifreq;cnt++)
  struct ifreq *ifr = &ifc.ifc_req[cnt]
  ioctl(s, SIOCGIFADDR, ifr); # get ip address

以下を含むより現代的な方法もあります。

if_nameindex()

if_nameindexとSIOCGIFCONFのSO検索を実行すると、これに類似した多くの質問が生成されます。

于 2011-06-02T21:03:15.813 に答える