2

この質問と回答に従って、IP アドレス (数字とドット表記) をそれぞれの符号なし整数に変換しました。つまり、 inet_aton 関数を利用します

関数をテストするために、c で非常に簡単なプログラムを作成しました。コードは次のとおりです。

int main(int argc, char** argv) {
    char* ip1 = "125.113.200.068";
    char* ip2 = "125.113.200.068";
    struct in_addr ip1s;
    inet_aton(ip1, &ip1s);
    struct in_addr ip2s;
    inet_aton(ip2, &ip2s);

    if (ip1s.s_addr == ip2s.s_addr) {
        printf("equal: %u = %u", ip1s.s_addr, ip2s.s_addr);
    }else{
        printf("not equal: %u != %u", ip1s.s_addr, ip2s.s_addr);
    }

    return (EXIT_SUCCESS);
}

2 つの文字列に同じ IP が指定されているにもかかわらず、次のような出力が得られます。

等しくない: 15774463 != 0

さらに、ips が 125.113.200.68 に設定されるように 0 を削除すると、関数は 2 つの等しい符号なし整数を返します。先行する 0 は IP を無効にしますか? しかし、そうであれば、前の例で ips の 1 つにゼロ以外の値を取得したのはなぜですか?

4

1 に答える 1

3

inet_atonの戻り値を確認する必要があります。

inet_aton()アドレスが有効な場合はゼロ以外を返し、アドレスが無効な場合はゼロを返します。

あなたの住所は無効です。068は先行ゼロのために 8 進数として解釈され8、有効な 8 進数ではありません。失敗した場合inet_aton、構造は変更されないin_addrため、出力しているのはランダムなスタック ガベージです。

いずれにせよ、inet_aton新しいコードにはお勧めできません。inet_pton代わりに使用してください。

于 2013-04-03T22:44:10.003 に答える