将ip地址转换为单个数字

Dhr*_*rah 3 c++ sorting ip-address

我有一个包含超过 100 个 IP 地址的文件(点分十进制,例如 169.23.43.12)。现在我需要读取所有 IP 地址并按升序排序。为此,首先我尝试将所有IP地址转换为其等效的整数。我创建了一个C++函数来转换IP地址,但它不适用于大IP地址,例如255.250.120.100。我尝试使用 inet_aton() 和 inet_ntoa()。但使用这两个,我无法对 IP 地址进行排序。所以,请给我一个想法,将IP地址转换成可以排序的形式。下面是一些我尝试对 ip 地址进行排序的代码,但没有成功。

struct sockaddr_in antelope[2]; 字符 *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;
Run Code Online (Sandbox Code Playgroud)

A.N*_*A.N 5

您可以使用 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;
    }
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。