2016-12-15 11 views
1

私は100を超えるIPアドレス(ドット付き10進数.169.23.43.12)を含むファイルを持っています。今私はすべてのIPアドレスを読み、昇順でソートする必要があります。まず、すべてのIPアドレスを等価整数に変換しようとしました.IPアドレスを変換するためのC++関数を作成しましたが、大きなIPアドレス(255.250.120.100など)では機能しませんでした。私はinet_aton()とinet_ntoa()を使ってみました。しかし、これらの2つを使用して、私はIPアドレスをソートできませんでした。ですから、IPアドレスをソートできる形式に変換するアイデアを教えてください。以下は、私がIPアドレスをソートしようとしたが、動作しなかったいくつかのコードです。ipアドレスを単一の数字に変換する

struct sockaddr_in antelope [2]; char * some_addr;

inet_aton("60.0.0.4", &antelope[0].sin_addr); // store IP in antelope 
inet_aton("10.0.0.2", &antelope[1].sin_addr); // store IP in antelope 
std::sort(antelope,antelope+2); 
cout<<inet_ntoa(antelope[0].sin_addr)<<endl; 
cout<<inet_ntoa(antelope[1].sin_addr)<<endl; 
+0

何がうまくいかなかったのですか?エラーは何ですか? std :: sortはsockaddr_in構造体をどのように注文するかを知らない。 –

+0

std :: sortにいくつかのエラーがあります。だから、inet_aton()を使った後、どのように並べ替えることができますか?あなたはそれらを並べ替えるための手順を知っていますか? –

+0

符号なし整数を使用しましたか?符号付き整数を使用すると、経験した動作が発生する可能性があります。 –

答えて

4

これは、struct sokaddr_inのカスタムコンパレータで行うことができます。以下のスニペットは、私が意味することを説明しています。この方法の利点は、IPv6用にコンパレータをカスタマイズし、ポート番号を含めることができることです。 IPアドレスが同じであれば他のものがあります。

#include <iostream> 
    #include <algorithm> 
    #include <arpa/inet.h> 


    struct CompareSockAddr_in 
    { 
     bool operator()(struct sockaddr_in ip1,struct sockaddr_in ip2){ 
      // use return ip1.sin_addr.s_addr < ip2.sin_addr.s_addr; for ascending order 
return ip1.sin_addr.s_addr > ip2.sin_addr.s_addr; 
     } 
    }; 

    int main() 
    { 
     struct sockaddr_in antelope[2]; 

     inet_pton(AF_INET, "10.0.0.2", &(antelope[0].sin_addr)); 
     inet_pton(AF_INET, "60.0.0.4", &(antelope[1].sin_addr)); 

     std::cout<<inet_ntoa(antelope[0].sin_addr)<<std::endl; 
     std::cout<<inet_ntoa(antelope[1].sin_addr)<<std::endl; 
     std::sort(antelope,antelope+2,CompareSockAddr_in()); 

     std::cout<<"Sorted List...\n"; 

     std::cout<<inet_ntoa(antelope[0].sin_addr)<<std::endl; 
     std::cout<<inet_ntoa(antelope[1].sin_addr)<<std::endl; 

     return 0; 
    } 

これが役に立ちます。

0

アドレスを符号なし整数に変換します。コードは次のようになります。

// If ip is 132.152.25.103, then unsigned int IP = {132, 152, 25, 103}; 
unsigned int identifier = 0; 
identifier = ((IP[0]*255 + IP[1])*255 + IP[2])*255 + IP[3]; 

すべての識別子をベクトル/配列に挿入してソートします。

+1

256、255ではなく。乗算よりも良い左シフト(<< 8)。 –

関連する問題