Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将ip地址转换为单个数字_C++_Sorting_Ip Address - Fatal编程技术网

C++ 将ip地址转换为单个数字

C++ 将ip地址转换为单个数字,c++,sorting,ip-address,C++,Sorting,Ip Address,我有一个包含100多个ip地址的文件(如169.23.43.12)。现在我需要读取所有ip地址并按升序排序。为此,首先我尝试将所有的IP地址转换成它的等效整数。我创建了一个C++函数来转换IP地址,但是它对于大IP地址(例如255.250.120)没有工作。我尝试使用inet_aton()和inet_ntoa()。但是使用这两个,我无法对ip地址进行排序。所以,请给我一个想法,把ip地址转换成可以排序的形式。下面是一些代码,我试图使用这些代码对ip地址进行排序,但没有成功 羚羊中的结构socka

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

羚羊中的结构sockaddr_[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;
inet_aton(“60.0.0.4”)和羚羊[0].sin_addr);//将IP存储在羚羊中
inet_aton(“10.0.0.2”)和羚羊[1]。sin_addr);//将IP存储在羚羊中
标准:排序(羚羊,羚羊+2);

无法将地址转换为无符号整数。代码可能如下所示:

//  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];

将所有标识符插入某个向量/数组并对其排序。

将地址转换为无符号整数。代码可能如下所示:

//  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];

将所有标识符插入某个向量/数组并对其进行排序。

您可以使用中struct sokaddr_的自定义比较器来完成此操作。下面的片段解释了我的意思。这种方法的优点是,您可以自定义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;
    }
#包括
#包括
#包括
中的结构比较ckaddr\u
{
bool运算符()(ip1中的结构sockaddr\u,ip2中的结构sockaddr\u){
//对于升序,使用return ip1.sin\u addr.s\u addrip2.sin_addr.s_addr;
}
};
int main()
{
羚羊中的结构sockaddr_[2];
内特普顿(AF_inet,“10.0.0.2”和(羚羊[0].sin_addr));
内特·普顿(AF_-inet,“60.0.0.4”和(羚羊[1].sin_addr));

std::cout您可以使用中struct sokaddr_的自定义比较器来完成此操作。下面的代码片段解释了我的意思。此方法的优点是您可以自定义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;
    }
#包括
#包括
#包括
中的结构比较ckaddr\u
{
bool运算符()(ip1中的结构sockaddr\u,ip2中的结构sockaddr\u){
//对于升序,使用return ip1.sin\u addr.s\u addrip2.sin_addr.s_addr;
}
};
int main()
{
羚羊中的结构sockaddr_[2];
内特普顿(AF_inet,“10.0.0.2”和(羚羊[0].sin_addr));
内特·普顿(AF_-inet,“60.0.0.4”和(羚羊[1].sin_addr));

std::cout第三个inet\u pton参数是指向in\u addr结构的指针。
成功的inet\u pton调用后,in\u addr结构将填充地址信息。 该结构的_addr字段包含网络字节顺序(相反顺序)的IP地址。 ntohl函数将地址从网络字节顺序转换为主机字节顺序

Example : 

#include <arpa/inet.h>
uint32_t NodeIpAddress::getIPv4AddressInteger(std::string IPv4Address) {
    int result;
    uint32_t IPv4Identifier = 0;
    struct in_addr addr;
    // store this IP address in sa:
    result = inet_pton(AF_INET, IPv4Address.c_str(), &(addr));
    if (result == -1) {         
gpLogFile->Write(LOGPREFIX, LogFile::LOGLEVEL_ERROR, _T("Failed to convert IP %hs to IPv4 Address. Due to invalid family of %d. WSA Error of %d"), IPv4Address.c_str(), AF_INET, result);
    }
    else if (result == 0) {
        gpLogFile->Write(LOGPREFIX, LogFile::LOGLEVEL_ERROR, _T("Failed to convert IP %hs to IPv4"), IPv4Address.c_str());
    }
    else {
        IPv4Identifier = ntohl(*((uint32_t *)&(addr)));
    }
    return IPv4Identifier;
}
示例:
#包括
uint32\u t NodeIpAddress::getIPv4AddressInteger(std::string IPv4Address){
int结果;
uint32\u t IPv4Identifier=0;
地址中的结构;
//将此IP地址存储在sa中:
结果=inet_pton(AF_inet,IPv4Address.c_str(),&(addr));
如果(结果==-1){
gpLogFile->Write(LOGPREFIX,LogFile::LOGLEVEL_ERROR,_T(“无法将IP%hs转换为IPv4地址。由于%d的族无效。WSA错误为%d”),IPv4Address.c_str(),AF_INET,result);
}
否则如果(结果==0){
gpLogFile->Write(LOGPREFIX,LogFile::LOGLEVEL_ERROR,_T(“无法将IP%hs转换为IPv4”)、IPv4Address.c_str();
}
否则{
IPv4Identifier=ntohl(*(uint32_t*)和(addr));
}
返回IPV4标识符;
}

第三个inet\u pton参数是指向in\u addr结构的指针。
成功的inet\u pton调用后,in\u addr结构将填充地址信息。 该结构的_addr字段包含网络字节顺序(相反顺序)的IP地址。 ntohl函数将地址从网络字节顺序转换为主机字节顺序

Example : 

#include <arpa/inet.h>
uint32_t NodeIpAddress::getIPv4AddressInteger(std::string IPv4Address) {
    int result;
    uint32_t IPv4Identifier = 0;
    struct in_addr addr;
    // store this IP address in sa:
    result = inet_pton(AF_INET, IPv4Address.c_str(), &(addr));
    if (result == -1) {         
gpLogFile->Write(LOGPREFIX, LogFile::LOGLEVEL_ERROR, _T("Failed to convert IP %hs to IPv4 Address. Due to invalid family of %d. WSA Error of %d"), IPv4Address.c_str(), AF_INET, result);
    }
    else if (result == 0) {
        gpLogFile->Write(LOGPREFIX, LogFile::LOGLEVEL_ERROR, _T("Failed to convert IP %hs to IPv4"), IPv4Address.c_str());
    }
    else {
        IPv4Identifier = ntohl(*((uint32_t *)&(addr)));
    }
    return IPv4Identifier;
}
示例:
#包括
uint32\u t NodeIpAddress::getIPv4AddressInteger(std::string IPv4Address){
int结果;
uint32\u t IPv4Identifier=0;
地址中的结构;
//将此IP地址存储在sa中:
结果=inet_pton(AF_inet,IPv4Address.c_str(),&(addr));
如果(结果==-1){
gpLogFile->Write(LOGPREFIX,LogFile::LOGLEVEL_ERROR,_T(“无法将IP%hs转换为IPv4地址。由于%d的族无效。WSA错误为%d”),IPv4Address.c_str(),AF_INET,result);
}
否则如果(结果==0){
gpLogFile->Write(LOGPREFIX,LogFile::LOGLEVEL_ERROR,_T(“无法将IP%hs转换为IPv4”)、IPv4Address.c_str();
}
否则{
IPv4Identifier=ntohl(*(uint32_t*)和(addr));
}
返回IPV4标识符;
}

什么不起作用?错误是什么?std::sort不知道如何在结构中排序sockaddr\u。std::sort会给出一些错误。因此,在使用inet\u aton()之后,如何对它们进行排序?你知道排序的过程吗?你使用了无符号整数吗?如果使用有符号整数,可能会出现这种情况。我在自己的函数中使用了无符号整数将ip地址转换为整数。它非常适用于小ip地址,如10.10.127.12。当我输入一个ip地址,如255.234.100.3 I在32位操作系统机器上,它给出了准确的结果。但在64位操作系统机器上,它给出了非常大的数字。什么不起作用?错误是什么?std::sort不知道如何在struct中对sockaddr_进行排序。std::sort给出了一些错误。因此,在使用inet_aton()之后,如何对它们进行排序?你知道如何对它们进行排序吗?你使用了无符号整数吗?如果使用有符号整数,你可能会遇到这种情况。我使用无符号整数进行排序