classes for ip and mac addr

This commit is contained in:
Erik Frojdh
2019-04-02 11:56:33 +02:00
parent 73ad238028
commit df2d67d90d
3 changed files with 84 additions and 130 deletions

View File

@ -1,16 +1,44 @@
#pragma once
#include <iostream>
#include <string>
namespace sls {
std::string MacAddrToString(uint64_t mac);
uint64_t MacStringToUint(std::string mac);
uint32_t IpStringToUint(const char *ipstr);
std::string IpToString(uint32_t ip);
std::string IpToHexString(uint32_t ip);
uint32_t HostnameToIp(const char *hostname);
class IpAddr {
private:
uint32_t addr_{0};
public:
explicit IpAddr(uint32_t address);
IpAddr(const std::string &address);
std::string str() const;
std::string hex() const;
bool operator==(const IpAddr &other) const { return addr_ == other.addr_; }
bool operator==(const uint32_t other) const { return addr_ == other; }
};
class MacAddr {
private:
uint64_t addr_{0};
std::string to_hex(const char delimiter = 0);
public:
MacAddr(std::string mac);
std::string str() { return to_hex(':'); }
std::string hex() { return to_hex(); }
bool operator==(const MacAddr &other) const { return addr_ == other.addr_; }
bool operator==(const uint64_t other) const { return addr_ == other; }
};
std::ostream &operator<<(std::ostream &out, const IpAddr &addr){
return out << addr.str();
}
} // namespace sls

View File

@ -11,8 +11,47 @@
#include <sys/socket.h>
#include <sys/types.h>
#include "network_utils.h"
namespace sls {
IpAddr::IpAddr(uint32_t address) : addr_{address} {}
IpAddr::IpAddr(const std::string &address) { inet_pton(AF_INET, address.c_str(), &addr_); }
std::string IpAddr::str() const {
char ipstring[INET_ADDRSTRLEN]{};
inet_ntop(AF_INET, &addr_, ipstring, INET_ADDRSTRLEN);
return ipstring;
}
std::string IpAddr::hex() const {
std::ostringstream ss;
ss << std::hex << std::setfill('0') << std::setw(2);
for (int i = 0; i != 4; ++i) {
ss << ((addr_ >> i * 8) & 0xFF);
}
return ss.str();
}
MacAddr::MacAddr(std::string mac) {
if ((mac.length() != 17) || (mac[2] != ':') || (mac[5] != ':') || (mac[8] != ':') ||
(mac[11] != ':') || (mac[14] != ':')) {
addr_ = 0;
}
mac.erase(std::remove(mac.begin(), mac.end(), ':'), mac.end());
addr_ = std::stol(mac, nullptr, 16);
}
std::string MacAddr::to_hex(const char delimiter) {
std::ostringstream ss;
ss << std::hex << std::setfill('0') << std::setw(2);
ss << ((addr_ >> 40) & 0xFF);
for (int i = 32; i >= 0; i -= 8) {
if (delimiter)
ss << delimiter;
ss << ((addr_ >> i) & 0xFF);
}
return ss.str();
}
std::string MacAddrToString(uint64_t mac) {
std::ostringstream ss;
ss << std::hex << std::setfill('0') << std::setw(2);
@ -44,11 +83,11 @@ std::string IpToString(uint32_t ip) {
return ipstring;
}
std::string IpToHexString(uint32_t ip){
std::ostringstream ss;
std::string IpToHexString(uint32_t ip) {
std::ostringstream ss;
ss << std::hex << std::setfill('0') << std::setw(2);
for (int i=0; i!=4; ++i){
ss << ((ip >> i*8) & 0xFF);
for (int i = 0; i != 4; ++i) {
ss << ((ip >> i * 8) & 0xFF);
}
return ss.str();
}
@ -67,11 +106,4 @@ uint32_t HostnameToIp(const char *hostname) {
return ip;
}
} // namespace sls
// char ipstring[INET_ADDRSTRLEN];
// inet_ntop(AF_INET, &detector_shm()->detectorIP, ipstring, INET_ADDRSTRLEN);
// inet_pton(AF_INET, DEFAULT_DET_IP, &(detector_shm()->detectorIP));