diff options
author | Matthias Schiffer <matthias@gamezock.de> | 2008-07-06 20:23:32 +0200 |
---|---|---|
committer | Matthias Schiffer <matthias@gamezock.de> | 2008-07-06 20:23:32 +0200 |
commit | e8ce659d0b0c9f399b55d2abb258b2f52af31cb6 (patch) | |
tree | 8bc71e127ade0cb4082ea960eb283581beaf1d93 /src/Net | |
parent | 77990eb4c0be93f510e8d5095c9133485999fef6 (diff) | |
download | mad-e8ce659d0b0c9f399b55d2abb258b2f52af31cb6.tar mad-e8ce659d0b0c9f399b55d2abb258b2f52af31cb6.zip |
ConfigurationManager hinzugef?gt; Listener-Adressen aus Konfiguration lesen
Diffstat (limited to 'src/Net')
-rw-r--r-- | src/Net/IPAddress.h | 67 |
1 files changed, 55 insertions, 12 deletions
diff --git a/src/Net/IPAddress.h b/src/Net/IPAddress.h index c1709d5..feeb010 100644 --- a/src/Net/IPAddress.h +++ b/src/Net/IPAddress.h @@ -29,29 +29,72 @@ namespace Net { class IPAddress { private: - std::string addr; - unsigned short p; + unsigned int addr; + unsigned short port; struct sockaddr_in sa; - + public: - IPAddress(const std::string &address, unsigned short port) throw(InvalidAddressException) : addr(address), p(port) { + IPAddress(unsigned int address, unsigned short port0) : addr(address), port(port0) { + sa.sin_family = AF_INET; + sa.sin_port = htons(port); + sa.sin_addr.s_addr = htonl(addr); + } + + IPAddress(const std::string &address) throw(InvalidAddressException) { + std::string ip; + size_t pos = address.find_first_of(':'); + + if(pos == std::string::npos) { + ip = address; + // TODO Default port + port = 6666; + } + else { + ip = address.substr(0, pos); + + char *endptr; + port = std::strtol(address.substr(pos+1).c_str(), &endptr, 10); + if(*endptr != 0 || port == 0) + throw InvalidAddressException(address); + } + sa.sin_family = AF_INET; sa.sin_port = htons(port); + + if(ip == "*") + sa.sin_addr.s_addr = INADDR_ANY; + else if(!inet_pton(AF_INET, ip.c_str(), &sa.sin_addr)) + throw InvalidAddressException(address); + + addr = ntohl(sa.sin_addr.s_addr); + } + + IPAddress(const std::string &address, unsigned short port0) throw(InvalidAddressException) : port(port0) { + sa.sin_family = AF_INET; + sa.sin_port = htons(port); + if(!inet_pton(AF_INET, address.c_str(), &sa.sin_addr)) throw InvalidAddressException(address); + + addr = ntohl(sa.sin_addr.s_addr); } - + IPAddress(const struct sockaddr_in &address) : sa(address) { - p = ntohs(sa.sin_port); - + port = ntohs(sa.sin_port); + addr = ntohl(sa.sin_addr.s_addr); + } + + unsigned int getAddress() const {return addr;} + unsigned short getPort() const {return port;} + + std::string getAddressString() const { char buf[INET_ADDRSTRLEN]; + unsigned int address = htonl(addr); + inet_ntop(AF_INET, &address, buf, sizeof(buf)); - addr = buf; + return std::string(buf); } - - const std::string& getAddress() const {return addr;} - unsigned short getPort() const {return p;} - + struct sockaddr* getSockAddr() {return reinterpret_cast<struct sockaddr*>(&sa);} socklen_t getSockAddrLength() const {return sizeof(sa);} }; |