我有一个包含100多个ip地址的文件(点分十进制.g.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]; 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 :(得分: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;
}
希望这有帮助。
答案 1 :(得分:1)
使用 std::istringstream
将字符串格式的 IPv4 地址转换为无符号整数的解决方案。
#include <sstream>
uint32_t convert( const std::string& ipv4Str )
{
std::istringstream iss( ipv4Str );
uint32_t ipv4 = 0;
for( uint32_t i = 0; i < 4; ++i ) {
uint32_t part;
iss >> part;
if ( iss.fail() || part > 255 ) {
throw std::runtime_error( "Invalid IP address - Expected [0, 255]" );
}
// LSHIFT and OR all parts together with the first part as the MSB
ipv4 |= part << ( 8 * ( 3 - i ) );
// Check for delimiter except on last iteration
if ( i != 3 ) {
char delimiter;
iss >> delimiter;
if ( iss.fail() || delimiter != '.' ) {
throw std::runtime_error( "Invalid IP address - Expected '.' delimiter" );
}
}
}
return ipv4;
}
示例结果
"0.0.0.5" => 5
"192.168.0.5" => 3232235525
"255.250.120.100" => 4294604900
"255.255.255.255" => 4294967295
答案 2 :(得分: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];
将所有标识符插入某个矢量/数组并对其进行排序。
答案 3 :(得分:0)
第三个inet_pton参数是一个指向in_addr结构的指针。成功完成inet_pton调用后,将使用地址信息填充in_addr结构。结构的S_addr字段以网络字节顺序(反向顺序)包含IP地址。 ntohl函数会将地址从网络字节顺序转换为主机字节顺序。