友人はfollowing snippet of codeを使用して、LAN内のホストのローカルIPアドレスを取得しました。gethostbyname()を使用してローカルIPを取得できません
int buffersize = 512;
char name[buffersize];
if(gethostname(name, buffersize) == -1){
Exception excep("Failed to retrieve the name of the computer");
excep.raise();
}
struct hostent *hp = gethostbyname(name);
if(hp == NULL){
Exception excep("Failed to retrieve the IP address of the local host");
excep.raise();
}
struct in_addr **addr_list = (struct in_addr **)hp->h_addr_list;
for(int i = 0; addr_list[i] != NULL; i++) {
qDebug() << QString(inet_ntoa(*addr_list[i]));
}
Macでは問題なく動作しているようです。彼は、その配列内の最後のIPアドレスは、知っておく必要があるものだと言いました。しかし、私は自分のLinuxノートパソコンでこれらの値を得ました...
これらは私のアダプターで使用されている値と似ていますが、同じではありません。ここではいくつかのifconfig
のデータがあります:
eth0 Link encap:Ethernet HWaddr 1C:C1:DE:91:54:1A
UP BROADCAST MULTICAST MTU:1500 Metric:1
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
wlan0 Link encap:Ethernet HWaddr [bleep]
inet addr:192.168.1.6 Bcast:192.168.1.255 Mask:255.255.255.0
ビットの一部がスクランブルされたことが表示されます。私たちはここで重要な転換を逃していますか?あなたが本当にのQtを使用している場合
私はあなたのコードをWindows上でテストしました(VS2010; ExceptionとQStringを使用していませんでした)、IPアドレスのOK値を返しています。 –
ホストが特定のデータを保存する方法に違いがあるのでしょうか?私は、ネットワークは普遍的に合意されたデータ表現方法を持っていると言われてきました。そのため、特定のものについて「ネットワークからホスト」および「ホストからネットワーク」への変換を行う必要があります。 – Pieter
'inet_ntoa'は廃止されました。しかし、次に、 'addr_list'の各文字列をどのようにデコードするのですか?マンページはネットワークバイトオーダーでコード化されているので、ホストの順序に戻しますか?私は各文字に対して 'ntohs()'を試みましたが、それは期待された結果を持っていませんでした。 – Pieter