1

IPアドレスを表す文字列があります。ipv4とipv6の両方にすることができます。

私が欲しいのは、それを10進形式に変換して、そこから個々のビットを取得できるようにすることです。

たとえば、文字列「192.168.0.1」で表されるアドレスの場合、10進数の3232235521を取得したいと思います。

最良の方法は、いくつかの標準ライブラリを使用することです。たとえば、関数inet_ptonはうまく機能します。でも使い方がわかりません。

ここにsockaddr_inに関する情報に基づいて次のコードを書きました:

   struct sockaddr_in sa;
   char str[INET_ADDRSTRLEN];
   // store this IP address in sa:
   inet_pton(AF_INET, "192.168.0.1", &(sa.sin_addr));
   cout<<"bin by inet_pton"<<sa.sin_addr.s_addr<<endl;

これで553779392になります。この番号は1.0.168.192に対応します。もちろん、なんとかしてこの数値を逆にする関数を書くこともできますが、IPアドレスをバイナリに変換するための標準的で効果的な方法を探しています。

4

3 に答える 3

3

Beejのネットワークプログラミングガイドからこのコードをヤンクしました。

struct sockaddr_in antelope;
char *some_addr;

inet_aton("10.0.0.1", &antelope.sin_addr); // store IP in antelope

some_addr = inet_ntoa(antelope.sin_addr); // return the IP
printf("%s\n", some_addr); // prints "10.0.0.1"

// and this call is the same as the inet_aton() call, above:
antelope.sin_addr.s_addr = inet_addr("10.0.0.1");

ここにあるのは、アドレス情報と文字列を格納するために一般的に使用される構造体のタイプ間でIPアドレスを前後に移動する例です。このコードの最後の行は、基本的に必要なものです。IPアドレスの整数表現は、antelope.sin_addr.s_addrに格納されています。s_addrはunsignedlongであるため、まさに必要なものである必要があります。これを行う場合:

cout << antelope.sin_addr.s_addr << endl;

10.0.0.1の10進表現を取得します

編集:私はあなたの元のコードの下にコメントを追加して、あなたがすでに持っているコードの問題を表現しました。これは基本的にエンディアンの問題です。この回答で私があなたに与えたコードはあなたに同じ問題を与えるかもしれません。バイト順序を逆にするには、htonl()を使用する必要があります。

于 2013-03-20T18:33:02.207 に答える
1

IPアドレスのINTEGER表現を取得するには:

@2to1muxの投稿にある次の情報に細心の注意を払う必要があります。

IPアドレスの整数表現は、antelope.sin_addr.s_addrに格納されています。

s_addrは単にunsignedlongです

例:

struct sockaddr_in antelope;

// Here I had to convert from NSString to c string
inet_pton(AF_INET, [ipAddress UTF8String], &(antelope.sin_addr));

// This line gets the integer value
UInt32 address = antelope.sin_addr.s_addr;

この追加の投稿が、私のように混乱している人にとって明確になることを願っています。

于 2014-04-23T16:37:57.310 に答える
0

ここに着陸し、IPアドレスが特定のIPアドレスのペアの間にあるかどうかをテストするための洗練されたソリューションを探しました。これが@2to1muxによるソリューションに基づいた私の2セントです。誰かが完全に機能する例を必要とする場合に備えて、すべてをまとめるだけです。これを変更してIPV6を処理できますか?

    #include <arpa/inet.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
           
    size_t ip_to_num(int family, char *IP)
    {
        size_t i = 0;
        struct sockaddr_in antelope;
        inet_pton(family, IP, &(antelope.sin_addr));
        i = ntohl(antelope.sin_addr.s_addr);
        
        return i;
    }
    
   
    void print_num_to_ip(int family, size_t i)
    {
        /* This structure is actually not required here.
            Added just to show how numbers can be transformed into valid socket structures.
        */        
        struct sockaddr_in antelope; 
    
        memset(&antelope, 0, sizeof(antelope));
        antelope.sin_family = family;
        antelope.sin_port = htons(0);
    
        antelope.sin_addr.s_addr = htonl(i);
        printf("IP: %zu [%s] \n", i, inet_ntoa(antelope.sin_addr));    
    }
    
    int main ()
    {
        char IP[INET6_ADDRSTRLEN]="192.168.0.2";
        size_t x = 0;
        
        x = ip_to_num(AF_INET, IP);
        
        printf("IP: %zu [%s] \n", x, IP);
        
        print_num_to_ip(AF_INET, x);
        
        exit(EXIT_SUCCESS);
    }
于 2021-05-27T12:17:49.753 に答える