3

IP Addressプログラムでローカルマシンのを取得しようとしています。オペレーティングシステムはUbuntu 8.10です。とを使用gethostname()gethostbyname()て取得してみましたIP Address。私が受け取った答えはです127.0.1.1。私はそれが物事のように思われることを学びましたDebianここにリンクされた文書はその考えを説明しました。

私の/etc/hostsファイルの内容は次のとおりです。

127.0.0.1 localhost
127.0.1.1 mymachine

この場合、マシン上のシステムファイルを変更せずにプログラムで(CまたはC ++を優先して)IPアドレスを取得する他の方法はありますか?

4

6 に答える 6

5

SIOCGIFCONF を示す簡単で汚れたコードを次に示します。

#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main()
{
    int sock, i;
    struct ifreq ifreqs[20];
    struct ifconf ic;

    ic.ifc_len = sizeof ifreqs;
    ic.ifc_req = ifreqs;

    sock = socket(AF_INET, SOCK_DGRAM, 0);
    if (sock < 0) {
        perror("socket");
        exit(1);
    }

    if (ioctl(sock, SIOCGIFCONF, &ic) < 0) {
        perror("SIOCGIFCONF");
        exit(1);
    }

    for (i = 0; i < ic.ifc_len/sizeof(struct ifreq); ++i)
        printf("%s: %s\n", ifreqs[i].ifr_name,
                inet_ntoa(((struct sockaddr_in*)&ifreqs[i].ifr_addr)->sin_addr));

    return 0;
}

Linux マシンで次の出力が得られます。

lo: 127.0.0.1
br0: 192.168.0.42
dummy1: 10.0.0.2
于 2009-03-31T16:52:15.540 に答える
3

したがって、ケンのポイントによると:

ip addr show scope global | grep inet | cut -d' ' -f6 | cut -d/ -f1

残念なことに、Debian の神々は「ip」コマンドを作成したとき、IP アドレスだけを取得するための単純なコマンドを追加することを考えていませんでした。

于 2011-04-23T20:57:00.583 に答える
2

「netdevice」をWebman netdeviceまたはWebで参照してください。
次に SIOCGIFCONF を使用して、すべてのトランスポート層アドレスの列挙を取得できます。

編集 (マンページ): manLinux (またはその他の UNIX 系システム) で非常に便利なコマンドです。ほとんどのコマンド、ライブラリ関数、プログラムなどの簡単な説明が表示されます。シェル プロンプトを開いてman lsorと入力するとman netdevice、意味がわかります。

編集(IPの一般的な取得について):Cの方法が面倒だと思う場合、最も簡単な方法は(頭のてっぺんから)次のような単純なシェルスクリプトです。
ifconfig|grep 'inet addr'|awk '{print $2}'|sed 's/addr://g'

編集 (Brain ソリューションで): 彼が行うことは、if_nameindex()関数を使用してすべてのネットワーク デバイス名を検索し、次にこれらの名前ごとに SIOCFIFCONF ioctl を使用して IP を検索することです。彼が言うように、デバイスごとに 1 つの IP しかリストされていません。

于 2009-03-31T14:10:12.090 に答える
1

ifconfigは非推奨であり、古いものです。iproute2は新しいスタックです。ipコマンドを使用します。

ip addr、そしてそこから解析します。

于 2011-04-23T14:22:31.937 に答える
1

共有してくれてありがとう!

bashソリューションの場合、これは私が最終的に行ったことです。

#!/bin/bash

/sbin/ifconfig|fgrep 'inet addr:'|fgrep -v '127'|cut -d: -f2|awk '{print $1}'|head -n1

マルチホームおよび/または論理インターフェイスもヘッドなしで返されるため、ヘッドはプライマリIPが返されることを保証します。

したがって、スクリプトが/ sbin / get_primary_ipにある場合は、次のようなことができます。

foo=$(get_primary_ip)
于 2010-10-28T18:37:47.897 に答える
1

netdeviceのman ページを見てください。SIOCGIFCONF を呼び出して、すべてのインターフェイスとそのアドレスのリストを取得します。

于 2009-03-31T14:06:39.523 に答える