ip man part 2 ip harder
This commit is contained in:
parent
cd85c3763d
commit
6fc1641c06
3 changed files with 56 additions and 12 deletions
|
@ -18,7 +18,10 @@ int main(int argc, char **argv) {
|
||||||
std::string net = HTONUL(test);
|
std::string net = HTONUL(test);
|
||||||
test = NTOHUL(net);
|
test = NTOHUL(net);
|
||||||
|
|
||||||
std::string time = sosc::clk::pack_time();
|
sosc::net::IpAddress ip1, ip2;
|
||||||
|
ip1.Parse("::*:FE:EF:F**F");
|
||||||
|
ip2.Parse("::ABCD:F*:*:F00F");
|
||||||
|
bool same = ip1 == ip2;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,33 +3,43 @@
|
||||||
// BEGIN IPADDRESS CLASS
|
// BEGIN IPADDRESS CLASS
|
||||||
|
|
||||||
sosc::net::IpAddress::IpAddress() {
|
sosc::net::IpAddress::IpAddress() {
|
||||||
|
this->Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void sosc::net::IpAddress::Reset() {
|
||||||
for(int i = 0; i < 8; ++i)
|
for(int i = 0; i < 8; ++i)
|
||||||
this->parts[i] = std::make_pair(0, 0);
|
this->parts[i] = std::make_pair(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool sosc::net::IpAddress::ParseError() {
|
||||||
|
this->Reset();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool sosc::net::IpAddress::Parse(const std::string& addr) {
|
bool sosc::net::IpAddress::Parse(const std::string& addr) {
|
||||||
std::string addr_trim = str::trim(addr);
|
std::string addr_trim = str::trim(addr);
|
||||||
|
|
||||||
auto parts = str::split(addr_trim, '.');
|
auto parts = str::split(addr_trim, '.');
|
||||||
if(parts.size() == 4)
|
if(parts.size() == 4)
|
||||||
return ParseIPv4Parts(parts);
|
return ParseIPv4Parts(parts)
|
||||||
|
? true : ParseError();
|
||||||
else if(parts.size() != 1)
|
else if(parts.size() != 1)
|
||||||
return false;
|
return ParseError();
|
||||||
|
|
||||||
parts = str::split(addr_trim, "::");
|
parts = str::split(addr_trim, "::");
|
||||||
if(parts.size() == 1) {
|
if(parts.size() == 1) {
|
||||||
if(ParseIPv6Part(parts[0], true) != 8)
|
if(ParseIPv6Part(parts[0], true) != 8)
|
||||||
return false;
|
return ParseError();
|
||||||
} else if(parts.size() == 2) {
|
} else if(parts.size() == 2) {
|
||||||
int left_cnt, right_cnt;
|
int left_cnt, right_cnt;
|
||||||
if((left_cnt = ParseIPv6Part(parts[0], true)) == -1)
|
if((left_cnt = ParseIPv6Part(parts[0], true)) == -1)
|
||||||
return false;
|
return ParseError();
|
||||||
if((right_cnt = ParseIPv6Part(parts[1], false)) == -1)
|
if((right_cnt = ParseIPv6Part(parts[1], false)) == -1)
|
||||||
return false;
|
return ParseError();
|
||||||
if(left_cnt + right_cnt > 8)
|
if(left_cnt + right_cnt > 8)
|
||||||
return false;
|
return ParseError();
|
||||||
} else
|
} else
|
||||||
return false;
|
return ParseError();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -92,11 +102,15 @@ int sosc::net::IpAddress::ParseIPv6Part
|
||||||
if(part[i] == '*') {
|
if(part[i] == '*') {
|
||||||
part[i] = '0';
|
part[i] = '0';
|
||||||
ptr->second |= 1 << (part_len - i - 1);
|
ptr->second |= 1 << (part_len - i - 1);
|
||||||
|
} else if(!(part[i] >= 'a' && part[i] <= 'f')
|
||||||
|
&& !(part[i] >= 'A' && part[i] <= 'F')
|
||||||
|
&& !(part[i] >= '0' && part[i] <= '9'))
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try { ptr->first = std::stoi(part, NULL, 16); }
|
ptr->first = std::stoi(part, NULL, 16);
|
||||||
catch(...) { return -1; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return parts.size();
|
return parts.size();
|
||||||
|
@ -111,7 +125,31 @@ sosc::net::IpAddress::operator const char* () const {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string sosc::net::IpAddress::ToString(bool force_ipv6) const {
|
std::string sosc::net::IpAddress::ToString(bool force_ipv6) const {
|
||||||
return "TODO THIS";
|
// TODO THIS
|
||||||
|
return "::";
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sosc::net::IpAddress::operator == (const IpAddress& rhs) const {
|
||||||
|
for(int i = 0; i < 8; ++i) {
|
||||||
|
uint8_t wildcards = this->parts[i].second | rhs.parts[i].second;
|
||||||
|
uint16_t mask = 0xFFFF;
|
||||||
|
|
||||||
|
if(wildcards != 0) {
|
||||||
|
for(int j = 0; j < 4; ++j) {
|
||||||
|
if((wildcards & (1 << j)) != 0)
|
||||||
|
mask &= ~(0xF << (4*j));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if((this->parts[i].first & mask) != (rhs.parts[i].first & mask))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sosc::net::IpAddress::operator != (const IpAddress& rhs) const {
|
||||||
|
return !(*this == rhs);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sosc::net::IpAddress::IsIdentical(const IpAddress& rhs) const {
|
bool sosc::net::IpAddress::IsIdentical(const IpAddress& rhs) const {
|
||||||
|
|
|
@ -76,9 +76,12 @@ private:
|
||||||
|
|
||||||
typedef std::pair<uint16_t, uint8_t> addrpart_t;
|
typedef std::pair<uint16_t, uint8_t> addrpart_t;
|
||||||
std::string tostr_cache;
|
std::string tostr_cache;
|
||||||
|
bool tostr_cache_inval = true;
|
||||||
addrpart_t parts[8];
|
addrpart_t parts[8];
|
||||||
|
|
||||||
bool ParseIPv4Parts(const std::vector<std:string>& parts);
|
void Reset();
|
||||||
|
bool ParseError();
|
||||||
|
bool ParseIPv4Parts(const std::vector<std::string>& parts);
|
||||||
int ParseIPv6Part(const std::string& addr_part, bool from_start);
|
int ParseIPv6Part(const std::string& addr_part, bool from_start);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue