From e8ce659d0b0c9f399b55d2abb258b2f52af31cb6 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 6 Jul 2008 20:23:32 +0200 Subject: ConfigurationManager hinzugef?gt; Listener-Adressen aus Konfiguration lesen --- src/Net/IPAddress.h | 67 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 55 insertions(+), 12 deletions(-) (limited to 'src/Net/IPAddress.h') 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(&sa);} socklen_t getSockAddrLength() const {return sizeof(sa);} }; -- cgit v1.2.3