2016-12-15 81 views
1

我有一個包含超過100個IP地址的文件(點分十進制例如169.23.43.12)。現在我需要讀取所有的IP地址並按升序排序。爲此,我首先嚐試將所有IP地址轉換爲其等效的整數。我創建了一個C++函數來轉換IP地址,但它不適用於大型IP地址,例如255.250.120.100。我試圖使用inet_aton()和inet_ntoa()。但使用這兩個,我無法排序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)而不是乘。 –

相關問題