1*9203SMark.Logan@Sun.COM /******************************************************************************* 2*9203SMark.Logan@Sun.COM * Copyright (C) 2004-2008 Intel Corp. All rights reserved. 3*9203SMark.Logan@Sun.COM * 4*9203SMark.Logan@Sun.COM * Redistribution and use in source and binary forms, with or without 5*9203SMark.Logan@Sun.COM * modification, are permitted provided that the following conditions are met: 6*9203SMark.Logan@Sun.COM * 7*9203SMark.Logan@Sun.COM * - Redistributions of source code must retain the above copyright notice, 8*9203SMark.Logan@Sun.COM * this list of conditions and the following disclaimer. 9*9203SMark.Logan@Sun.COM * 10*9203SMark.Logan@Sun.COM * - Redistributions in binary form must reproduce the above copyright notice, 11*9203SMark.Logan@Sun.COM * this list of conditions and the following disclaimer in the documentation 12*9203SMark.Logan@Sun.COM * and/or other materials provided with the distribution. 13*9203SMark.Logan@Sun.COM * 14*9203SMark.Logan@Sun.COM * - Neither the name of Intel Corp. nor the names of its 15*9203SMark.Logan@Sun.COM * contributors may be used to endorse or promote products derived from this 16*9203SMark.Logan@Sun.COM * software without specific prior written permission. 17*9203SMark.Logan@Sun.COM * 18*9203SMark.Logan@Sun.COM * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' 19*9203SMark.Logan@Sun.COM * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*9203SMark.Logan@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*9203SMark.Logan@Sun.COM * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corp. OR THE CONTRIBUTORS 22*9203SMark.Logan@Sun.COM * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*9203SMark.Logan@Sun.COM * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*9203SMark.Logan@Sun.COM * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*9203SMark.Logan@Sun.COM * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*9203SMark.Logan@Sun.COM * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*9203SMark.Logan@Sun.COM * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*9203SMark.Logan@Sun.COM * POSSIBILITY OF SUCH DAMAGE. 29*9203SMark.Logan@Sun.COM *******************************************************************************/ 30*9203SMark.Logan@Sun.COM 31*9203SMark.Logan@Sun.COM #ifndef _AT_NETWORK_TOOL_H_ 32*9203SMark.Logan@Sun.COM #define _AT_NETWORK_TOOL_H_ 33*9203SMark.Logan@Sun.COM 34*9203SMark.Logan@Sun.COM #include <string> 35*9203SMark.Logan@Sun.COM #include <set> 36*9203SMark.Logan@Sun.COM #include <vector> 37*9203SMark.Logan@Sun.COM #include <map> 38*9203SMark.Logan@Sun.COM #include <cstring> 39*9203SMark.Logan@Sun.COM #include <sys/types.h> 40*9203SMark.Logan@Sun.COM #include <sys/socket.h> 41*9203SMark.Logan@Sun.COM #include <arpa/inet.h> 42*9203SMark.Logan@Sun.COM #include <netinet/in.h> 43*9203SMark.Logan@Sun.COM 44*9203SMark.Logan@Sun.COM class ATAddress 45*9203SMark.Logan@Sun.COM { 46*9203SMark.Logan@Sun.COM private: 47*9203SMark.Logan@Sun.COM struct sockaddr_storage ip; 48*9203SMark.Logan@Sun.COM 49*9203SMark.Logan@Sun.COM public: 50*9203SMark.Logan@Sun.COM ATAddress()51*9203SMark.Logan@Sun.COM ATAddress() 52*9203SMark.Logan@Sun.COM { 53*9203SMark.Logan@Sun.COM memset(&(this->ip), 0, sizeof(struct sockaddr_storage)); 54*9203SMark.Logan@Sun.COM }; 55*9203SMark.Logan@Sun.COM ATAddress(const ATAddress & y)56*9203SMark.Logan@Sun.COM ATAddress(const ATAddress &y) 57*9203SMark.Logan@Sun.COM { 58*9203SMark.Logan@Sun.COM memcpy(&(this->ip), y.addr(), sizeof(struct sockaddr_storage)); 59*9203SMark.Logan@Sun.COM }; 60*9203SMark.Logan@Sun.COM ATAddress(const struct sockaddr * yip)61*9203SMark.Logan@Sun.COM ATAddress(const struct sockaddr *yip) 62*9203SMark.Logan@Sun.COM { 63*9203SMark.Logan@Sun.COM memset(&(this->ip), 0, sizeof(struct sockaddr_storage)); 64*9203SMark.Logan@Sun.COM memcpy(&(this->ip), yip, saSize(yip)); 65*9203SMark.Logan@Sun.COM }; 66*9203SMark.Logan@Sun.COM ATAddress(const ATAddress & y,in_port_t yport)67*9203SMark.Logan@Sun.COM ATAddress(const ATAddress &y, in_port_t yport) 68*9203SMark.Logan@Sun.COM { 69*9203SMark.Logan@Sun.COM memcpy(&(this->ip), y.addr(), sizeof(struct sockaddr_storage)); 70*9203SMark.Logan@Sun.COM ATAddress::saSetPort((const struct sockaddr *)&(this->ip), yport); 71*9203SMark.Logan@Sun.COM }; 72*9203SMark.Logan@Sun.COM ATAddress(const struct sockaddr * yip,in_port_t yport)73*9203SMark.Logan@Sun.COM ATAddress(const struct sockaddr *yip, in_port_t yport) 74*9203SMark.Logan@Sun.COM { 75*9203SMark.Logan@Sun.COM memset(&(this->ip), 0, sizeof(struct sockaddr_storage)); 76*9203SMark.Logan@Sun.COM memcpy(&(this->ip), yip, saSize(yip)); 77*9203SMark.Logan@Sun.COM ATAddress::saSetPort((const struct sockaddr *)&(this->ip), yport); 78*9203SMark.Logan@Sun.COM }; 79*9203SMark.Logan@Sun.COM saSetPort(const struct sockaddr * ip,in_port_t yport)80*9203SMark.Logan@Sun.COM static void saSetPort(const struct sockaddr *ip, in_port_t yport) 81*9203SMark.Logan@Sun.COM { 82*9203SMark.Logan@Sun.COM switch (ip->sa_family) { 83*9203SMark.Logan@Sun.COM case AF_INET6: 84*9203SMark.Logan@Sun.COM ((struct sockaddr_in6 *)ip)->sin6_port = htons(yport); 85*9203SMark.Logan@Sun.COM break; 86*9203SMark.Logan@Sun.COM 87*9203SMark.Logan@Sun.COM case AF_INET: 88*9203SMark.Logan@Sun.COM ((struct sockaddr_in *)ip)->sin_port = htons(yport); 89*9203SMark.Logan@Sun.COM break; 90*9203SMark.Logan@Sun.COM } 91*9203SMark.Logan@Sun.COM } 92*9203SMark.Logan@Sun.COM saIsInet(const struct sockaddr * ip)93*9203SMark.Logan@Sun.COM static bool saIsInet(const struct sockaddr *ip) 94*9203SMark.Logan@Sun.COM { 95*9203SMark.Logan@Sun.COM return ((ip->sa_family == AF_INET) || (ip->sa_family == AF_INET6)); 96*9203SMark.Logan@Sun.COM }; 97*9203SMark.Logan@Sun.COM saSize(const struct sockaddr * ip)98*9203SMark.Logan@Sun.COM static unsigned int saSize(const struct sockaddr *ip) 99*9203SMark.Logan@Sun.COM { 100*9203SMark.Logan@Sun.COM switch (ip->sa_family) { 101*9203SMark.Logan@Sun.COM case AF_INET6: 102*9203SMark.Logan@Sun.COM return sizeof(struct sockaddr_in6); 103*9203SMark.Logan@Sun.COM break; 104*9203SMark.Logan@Sun.COM 105*9203SMark.Logan@Sun.COM case AF_INET: 106*9203SMark.Logan@Sun.COM return sizeof(struct sockaddr_in); 107*9203SMark.Logan@Sun.COM break; 108*9203SMark.Logan@Sun.COM 109*9203SMark.Logan@Sun.COM default: 110*9203SMark.Logan@Sun.COM return 0; 111*9203SMark.Logan@Sun.COM } 112*9203SMark.Logan@Sun.COM }; 113*9203SMark.Logan@Sun.COM saInPort(const struct sockaddr * ip)114*9203SMark.Logan@Sun.COM static in_port_t saInPort(const struct sockaddr *ip) 115*9203SMark.Logan@Sun.COM { 116*9203SMark.Logan@Sun.COM switch (ip->sa_family) { 117*9203SMark.Logan@Sun.COM case AF_INET6: 118*9203SMark.Logan@Sun.COM return ntohs(((struct sockaddr_in6 *)ip)->sin6_port); 119*9203SMark.Logan@Sun.COM break; 120*9203SMark.Logan@Sun.COM 121*9203SMark.Logan@Sun.COM case AF_INET: 122*9203SMark.Logan@Sun.COM return ntohs(((struct sockaddr_in *)ip)->sin_port); 123*9203SMark.Logan@Sun.COM break; 124*9203SMark.Logan@Sun.COM 125*9203SMark.Logan@Sun.COM default: 126*9203SMark.Logan@Sun.COM return 0; 127*9203SMark.Logan@Sun.COM } 128*9203SMark.Logan@Sun.COM }; 129*9203SMark.Logan@Sun.COM saInAddr(const struct sockaddr * ip,size_t & asize)130*9203SMark.Logan@Sun.COM static const void *saInAddr(const struct sockaddr *ip, size_t &asize) 131*9203SMark.Logan@Sun.COM { 132*9203SMark.Logan@Sun.COM switch (ip->sa_family) { 133*9203SMark.Logan@Sun.COM case AF_INET6: 134*9203SMark.Logan@Sun.COM asize = sizeof(in6_addr); 135*9203SMark.Logan@Sun.COM return (const void *)&(((struct sockaddr_in6 *)ip)->sin6_addr); 136*9203SMark.Logan@Sun.COM break; 137*9203SMark.Logan@Sun.COM 138*9203SMark.Logan@Sun.COM case AF_INET: 139*9203SMark.Logan@Sun.COM asize = sizeof(in_addr); 140*9203SMark.Logan@Sun.COM return (const void *)&(((struct sockaddr_in *)ip)->sin_addr); 141*9203SMark.Logan@Sun.COM break; 142*9203SMark.Logan@Sun.COM 143*9203SMark.Logan@Sun.COM default: 144*9203SMark.Logan@Sun.COM asize = 0; 145*9203SMark.Logan@Sun.COM return NULL; 146*9203SMark.Logan@Sun.COM } 147*9203SMark.Logan@Sun.COM }; 148*9203SMark.Logan@Sun.COM saInNtoP(const struct sockaddr * ip,char * buf,size_t buflen)149*9203SMark.Logan@Sun.COM static const char *saInNtoP(const struct sockaddr *ip, char *buf, size_t buflen) 150*9203SMark.Logan@Sun.COM { 151*9203SMark.Logan@Sun.COM if (!ATAddress::saIsInet(ip)) { 152*9203SMark.Logan@Sun.COM return NULL; 153*9203SMark.Logan@Sun.COM } 154*9203SMark.Logan@Sun.COM 155*9203SMark.Logan@Sun.COM size_t asize; 156*9203SMark.Logan@Sun.COM const void *src = ATAddress::saInAddr(ip, asize); 157*9203SMark.Logan@Sun.COM if (NULL == src) { 158*9203SMark.Logan@Sun.COM return NULL; 159*9203SMark.Logan@Sun.COM } 160*9203SMark.Logan@Sun.COM return inet_ntop(ip->sa_family, src, buf, buflen); 161*9203SMark.Logan@Sun.COM }; 162*9203SMark.Logan@Sun.COM family()163*9203SMark.Logan@Sun.COM sa_family_t family() const { return ip.ss_family; }; 164*9203SMark.Logan@Sun.COM isInet()165*9203SMark.Logan@Sun.COM bool isInet() const { return ((ip.ss_family == AF_INET) || (ip.ss_family == AF_INET6)); }; 166*9203SMark.Logan@Sun.COM size()167*9203SMark.Logan@Sun.COM unsigned int size() const 168*9203SMark.Logan@Sun.COM { 169*9203SMark.Logan@Sun.COM return ATAddress::saSize((const struct sockaddr *)&(this->ip)); 170*9203SMark.Logan@Sun.COM }; 171*9203SMark.Logan@Sun.COM addr()172*9203SMark.Logan@Sun.COM const struct sockaddr *addr() const 173*9203SMark.Logan@Sun.COM { 174*9203SMark.Logan@Sun.COM return (const struct sockaddr *)&ip; 175*9203SMark.Logan@Sun.COM }; 176*9203SMark.Logan@Sun.COM inPort()177*9203SMark.Logan@Sun.COM in_port_t inPort() const 178*9203SMark.Logan@Sun.COM { 179*9203SMark.Logan@Sun.COM return ATAddress::saInPort((const struct sockaddr *)&(this->ip)); 180*9203SMark.Logan@Sun.COM }; 181*9203SMark.Logan@Sun.COM inAddr(size_t & asize)182*9203SMark.Logan@Sun.COM const void *inAddr(size_t &asize) const 183*9203SMark.Logan@Sun.COM { 184*9203SMark.Logan@Sun.COM return ATAddress::saInAddr((const struct sockaddr *)&(this->ip), asize); 185*9203SMark.Logan@Sun.COM }; 186*9203SMark.Logan@Sun.COM inNtoP(char * buf,size_t buflen)187*9203SMark.Logan@Sun.COM const char *inNtoP(char *buf, size_t buflen) 188*9203SMark.Logan@Sun.COM { 189*9203SMark.Logan@Sun.COM return ATAddress::saInNtoP((const struct sockaddr *)&(this->ip), buf, buflen); 190*9203SMark.Logan@Sun.COM }; 191*9203SMark.Logan@Sun.COM 192*9203SMark.Logan@Sun.COM ATAddress &operator=(const ATAddress &y) 193*9203SMark.Logan@Sun.COM { 194*9203SMark.Logan@Sun.COM if (this != &y) { 195*9203SMark.Logan@Sun.COM memcpy(&(this->ip), y.addr(), sizeof(struct sockaddr_storage)); 196*9203SMark.Logan@Sun.COM } 197*9203SMark.Logan@Sun.COM return *this; 198*9203SMark.Logan@Sun.COM }; 199*9203SMark.Logan@Sun.COM 200*9203SMark.Logan@Sun.COM ATAddress &operator=(const struct sockaddr &yip) 201*9203SMark.Logan@Sun.COM { 202*9203SMark.Logan@Sun.COM memset(&(this->ip), 0, sizeof(struct sockaddr_storage)); 203*9203SMark.Logan@Sun.COM memcpy(&(this->ip), &yip, saSize(&yip)); 204*9203SMark.Logan@Sun.COM return *this; 205*9203SMark.Logan@Sun.COM }; 206*9203SMark.Logan@Sun.COM compare(const ATAddress & y)207*9203SMark.Logan@Sun.COM int compare(const ATAddress &y) const 208*9203SMark.Logan@Sun.COM { 209*9203SMark.Logan@Sun.COM if (this->family() != y.family()) { 210*9203SMark.Logan@Sun.COM return (this->family() - y.family()); 211*9203SMark.Logan@Sun.COM } 212*9203SMark.Logan@Sun.COM 213*9203SMark.Logan@Sun.COM size_t asize = 0; 214*9203SMark.Logan@Sun.COM const void *a = this->inAddr(asize); 215*9203SMark.Logan@Sun.COM const void *b = y.inAddr(asize); 216*9203SMark.Logan@Sun.COM if ((0 != asize) && (NULL != a) && (NULL != b)) { 217*9203SMark.Logan@Sun.COM int adiff = memcmp(a, b, asize); 218*9203SMark.Logan@Sun.COM if (adiff != 0) { 219*9203SMark.Logan@Sun.COM return adiff; 220*9203SMark.Logan@Sun.COM } 221*9203SMark.Logan@Sun.COM } 222*9203SMark.Logan@Sun.COM 223*9203SMark.Logan@Sun.COM in_port_t ap = this->inPort(); 224*9203SMark.Logan@Sun.COM in_port_t bp = y.inPort(); 225*9203SMark.Logan@Sun.COM if ((ap == 0) || (bp == 0)) { 226*9203SMark.Logan@Sun.COM return 0; 227*9203SMark.Logan@Sun.COM } 228*9203SMark.Logan@Sun.COM if (ap != bp) { 229*9203SMark.Logan@Sun.COM return (ap - bp); 230*9203SMark.Logan@Sun.COM } 231*9203SMark.Logan@Sun.COM 232*9203SMark.Logan@Sun.COM return memcmp(&(this->ip), y.addr(), this->size()); 233*9203SMark.Logan@Sun.COM }; 234*9203SMark.Logan@Sun.COM 235*9203SMark.Logan@Sun.COM bool operator<(const ATAddress &y) const 236*9203SMark.Logan@Sun.COM { 237*9203SMark.Logan@Sun.COM if (this == &y) { 238*9203SMark.Logan@Sun.COM return false; 239*9203SMark.Logan@Sun.COM } 240*9203SMark.Logan@Sun.COM return (this->compare(y) < 0); 241*9203SMark.Logan@Sun.COM }; 242*9203SMark.Logan@Sun.COM 243*9203SMark.Logan@Sun.COM bool operator>(const ATAddress &y) const 244*9203SMark.Logan@Sun.COM { 245*9203SMark.Logan@Sun.COM if (this == &y) { 246*9203SMark.Logan@Sun.COM return false; 247*9203SMark.Logan@Sun.COM } 248*9203SMark.Logan@Sun.COM return (this->compare(y) > 0); 249*9203SMark.Logan@Sun.COM }; 250*9203SMark.Logan@Sun.COM 251*9203SMark.Logan@Sun.COM bool operator==(const ATAddress &y) const 252*9203SMark.Logan@Sun.COM { 253*9203SMark.Logan@Sun.COM if (this == &y) { 254*9203SMark.Logan@Sun.COM return true; 255*9203SMark.Logan@Sun.COM } 256*9203SMark.Logan@Sun.COM if (this->family() != y.family()) { 257*9203SMark.Logan@Sun.COM return false; 258*9203SMark.Logan@Sun.COM } 259*9203SMark.Logan@Sun.COM return (memcmp(&(this->ip), y.addr(), this->size()) == 0); 260*9203SMark.Logan@Sun.COM }; 261*9203SMark.Logan@Sun.COM 262*9203SMark.Logan@Sun.COM bool operator!=(const ATAddress &y) const 263*9203SMark.Logan@Sun.COM { 264*9203SMark.Logan@Sun.COM if (this == &y) { 265*9203SMark.Logan@Sun.COM return false; 266*9203SMark.Logan@Sun.COM } 267*9203SMark.Logan@Sun.COM if (this->family() != y.family()) { 268*9203SMark.Logan@Sun.COM return true; 269*9203SMark.Logan@Sun.COM } 270*9203SMark.Logan@Sun.COM return (memcmp(&(this->ip), y.addr(), this->size()) != 0); 271*9203SMark.Logan@Sun.COM }; 272*9203SMark.Logan@Sun.COM 273*9203SMark.Logan@Sun.COM static bool IsAddressIP(const char *address, int family = AF_INET) 274*9203SMark.Logan@Sun.COM { 275*9203SMark.Logan@Sun.COM struct sockaddr_storage inaddr; 276*9203SMark.Logan@Sun.COM 277*9203SMark.Logan@Sun.COM if (address == NULL) { 278*9203SMark.Logan@Sun.COM return false; 279*9203SMark.Logan@Sun.COM } 280*9203SMark.Logan@Sun.COM return (0 < inet_pton(family, address, &inaddr)); 281*9203SMark.Logan@Sun.COM }; 282*9203SMark.Logan@Sun.COM }; 283*9203SMark.Logan@Sun.COM 284*9203SMark.Logan@Sun.COM 285*9203SMark.Logan@Sun.COM typedef std::set<ATAddress> ATAddressList; 286*9203SMark.Logan@Sun.COM typedef std::map<ATAddress, std::string> ATDomainMap; 287*9203SMark.Logan@Sun.COM typedef std::vector<int> ATSocketList; 288*9203SMark.Logan@Sun.COM 289*9203SMark.Logan@Sun.COM class ATNetworkTool 290*9203SMark.Logan@Sun.COM { 291*9203SMark.Logan@Sun.COM public: 292*9203SMark.Logan@Sun.COM static const int DefaultBacklog = 5; 293*9203SMark.Logan@Sun.COM static const int DefaultFamily = AF_INET; 294*9203SMark.Logan@Sun.COM static const int AF_XINETX = AF_MAX + 10; 295*9203SMark.Logan@Sun.COM 296*9203SMark.Logan@Sun.COM /* Gets Domain name from Hostname 297*9203SMark.Logan@Sun.COM * @param name hostname 298*9203SMark.Logan@Sun.COM * @param domain [out] domain name 299*9203SMark.Logan@Sun.COM * @return bool true if success, false if domain unknown 300*9203SMark.Logan@Sun.COM */ 301*9203SMark.Logan@Sun.COM static bool GetHostNameDomain(const char *name, std::string &domain); 302*9203SMark.Logan@Sun.COM 303*9203SMark.Logan@Sun.COM /* Gets Domain name from IP 304*9203SMark.Logan@Sun.COM * @param ip address 305*9203SMark.Logan@Sun.COM * @param domain [out] domain name 306*9203SMark.Logan@Sun.COM * @param error [out] error code 307*9203SMark.Logan@Sun.COM * @return bool true if success, false if domain unknown 308*9203SMark.Logan@Sun.COM */ 309*9203SMark.Logan@Sun.COM static bool GetIPDomain(const ATAddress &ip, std::string &domain, int &error); 310*9203SMark.Logan@Sun.COM 311*9203SMark.Logan@Sun.COM /* Gets Domain name from host entry 312*9203SMark.Logan@Sun.COM * @param hent pointer to host entry structure 313*9203SMark.Logan@Sun.COM * @param domain [out] domain name 314*9203SMark.Logan@Sun.COM * @return bool true if success, false if domain unknown 315*9203SMark.Logan@Sun.COM */ 316*9203SMark.Logan@Sun.COM static bool GetHentDomain(struct hostent *hent, std::string &domain); 317*9203SMark.Logan@Sun.COM 318*9203SMark.Logan@Sun.COM /* Gets Domain name from socket 319*9203SMark.Logan@Sun.COM * @param sock checked socket 320*9203SMark.Logan@Sun.COM * @param domain [out] domain name 321*9203SMark.Logan@Sun.COM * @param error [out] error code 322*9203SMark.Logan@Sun.COM * @return int ==1 if success, <0 on error, ==0 if no domain 323*9203SMark.Logan@Sun.COM */ 324*9203SMark.Logan@Sun.COM static int GetSockDomain(int sock, std::string &domain, int &error); 325*9203SMark.Logan@Sun.COM 326*9203SMark.Logan@Sun.COM /* Gets all local (IPv4/6) from local running network interfaces 327*9203SMark.Logan@Sun.COM * @param addresses [out] set of local IP addresses 328*9203SMark.Logan@Sun.COM * @param error [out] error code 329*9203SMark.Logan@Sun.COM * @param family filtered address family 330*9203SMark.Logan@Sun.COM * @param withloopback true if get loopback addresses too 331*9203SMark.Logan@Sun.COM * @return int ==0 if success, !=0 on error 332*9203SMark.Logan@Sun.COM */ 333*9203SMark.Logan@Sun.COM static int GetLocalIPs(ATAddressList &addresses, int &error, 334*9203SMark.Logan@Sun.COM int family = ATNetworkTool::AF_XINETX, 335*9203SMark.Logan@Sun.COM bool withloopback = false); 336*9203SMark.Logan@Sun.COM 337*9203SMark.Logan@Sun.COM /* Gets all local domains from local running network interfaces 338*9203SMark.Logan@Sun.COM * @param domains [out] map of <local IP address> => <domain name> 339*9203SMark.Logan@Sun.COM * @param error [out] error code 340*9203SMark.Logan@Sun.COM * @param family filtered address family 341*9203SMark.Logan@Sun.COM * @return int ==0 if success, !=0 on error 342*9203SMark.Logan@Sun.COM */ 343*9203SMark.Logan@Sun.COM static int GetLocalNetDomains(ATDomainMap &domains, int &error, 344*9203SMark.Logan@Sun.COM int family = ATNetworkTool::AF_XINETX); 345*9203SMark.Logan@Sun.COM 346*9203SMark.Logan@Sun.COM /* Gets all (IPv4/6) network interfaces of socket peer 347*9203SMark.Logan@Sun.COM * @param addresses [out] set of peer IP addresses 348*9203SMark.Logan@Sun.COM * @param error [out] error code 349*9203SMark.Logan@Sun.COM * @param family filtered address family 350*9203SMark.Logan@Sun.COM * @param zeroport set port to 0 in result list 351*9203SMark.Logan@Sun.COM * @return int ==0 if success, !=0 on error 352*9203SMark.Logan@Sun.COM */ 353*9203SMark.Logan@Sun.COM static int GetSockPeerIPs(int sock, ATAddressList &addresses, 354*9203SMark.Logan@Sun.COM int &error, 355*9203SMark.Logan@Sun.COM int family = ATNetworkTool::AF_XINETX, 356*9203SMark.Logan@Sun.COM bool zeroport = false); 357*9203SMark.Logan@Sun.COM 358*9203SMark.Logan@Sun.COM /* Checks if socket peer is (IPv4/6) local address 359*9203SMark.Logan@Sun.COM * @param sock checked socket 360*9203SMark.Logan@Sun.COM * @param error [out] error code 361*9203SMark.Logan@Sun.COM * @param family filtered address family 362*9203SMark.Logan@Sun.COM * @return int ==1 if peer is local, ==0 if remote, <0 on error 363*9203SMark.Logan@Sun.COM */ 364*9203SMark.Logan@Sun.COM static int IsSockPeerLocal(int sock, int &error, 365*9203SMark.Logan@Sun.COM int family = ATNetworkTool::AF_XINETX); 366*9203SMark.Logan@Sun.COM 367*9203SMark.Logan@Sun.COM /* Closes socket 368*9203SMark.Logan@Sun.COM * @param s socket to close 369*9203SMark.Logan@Sun.COM * @return int ==0 if success, !=0 on error 370*9203SMark.Logan@Sun.COM */ 371*9203SMark.Logan@Sun.COM static int CloseSocket(int s); 372*9203SMark.Logan@Sun.COM 373*9203SMark.Logan@Sun.COM /* Sets/removes O_NONBLOCKING flag to socket 374*9203SMark.Logan@Sun.COM * @param s socket 375*9203SMark.Logan@Sun.COM * @param block - true to set flag, false to remove flag 376*9203SMark.Logan@Sun.COM * @return int ==0 if success, !=0 on error 377*9203SMark.Logan@Sun.COM */ 378*9203SMark.Logan@Sun.COM static int SetNonBlocking(int s, bool block = true); 379*9203SMark.Logan@Sun.COM 380*9203SMark.Logan@Sun.COM /* Creates socket 381*9203SMark.Logan@Sun.COM * @param addr socket parameters 382*9203SMark.Logan@Sun.COM * @param error [out] error code 383*9203SMark.Logan@Sun.COM * @return int !=-1 socket, ==-1 on error 384*9203SMark.Logan@Sun.COM */ 385*9203SMark.Logan@Sun.COM static int CreateSocket(const struct addrinfo *addr, int &error); 386*9203SMark.Logan@Sun.COM 387*9203SMark.Logan@Sun.COM /* Creates socket 388*9203SMark.Logan@Sun.COM * @param addr socket address 389*9203SMark.Logan@Sun.COM * @param addrlen socket address length 390*9203SMark.Logan@Sun.COM * @param error [out] error code 391*9203SMark.Logan@Sun.COM * @param family socket expected family 392*9203SMark.Logan@Sun.COM * @param socktype socket type 393*9203SMark.Logan@Sun.COM * @param protocol socket protocol 394*9203SMark.Logan@Sun.COM * @return int !=-1 socket, ==-1 on error 395*9203SMark.Logan@Sun.COM */ 396*9203SMark.Logan@Sun.COM static int CreateSocket(const struct sockaddr *addr, socklen_t addrlen, 397*9203SMark.Logan@Sun.COM int &error, 398*9203SMark.Logan@Sun.COM int family = ATNetworkTool::DefaultFamily, 399*9203SMark.Logan@Sun.COM int socktype = SOCK_STREAM, int protocol = 0); 400*9203SMark.Logan@Sun.COM 401*9203SMark.Logan@Sun.COM /* Creates server listening socket 402*9203SMark.Logan@Sun.COM * @param addr socket parameters 403*9203SMark.Logan@Sun.COM * @param error [out] error code 404*9203SMark.Logan@Sun.COM * @param nonblocking true for nonblocking socket 405*9203SMark.Logan@Sun.COM * @param backlog listening backlog 406*9203SMark.Logan@Sun.COM * @return int !=-1 socket, ==-1 on error 407*9203SMark.Logan@Sun.COM */ 408*9203SMark.Logan@Sun.COM static int CreateServerSocket(const struct addrinfo *addr, 409*9203SMark.Logan@Sun.COM int &error, bool nonblocking = true, 410*9203SMark.Logan@Sun.COM int backlog = ATNetworkTool::DefaultBacklog); 411*9203SMark.Logan@Sun.COM 412*9203SMark.Logan@Sun.COM /* Creates server listening sockets 413*9203SMark.Logan@Sun.COM * @param sockets [out] list of created server listening sockets 414*9203SMark.Logan@Sun.COM * @param port listening port 415*9203SMark.Logan@Sun.COM * @param error [out] error code 416*9203SMark.Logan@Sun.COM * @param loopback true to listen only on loopback 417*9203SMark.Logan@Sun.COM * @param nonblocking true for nonblocking sockets 418*9203SMark.Logan@Sun.COM * @param family sockets expected family 419*9203SMark.Logan@Sun.COM * @param socktype sockets type 420*9203SMark.Logan@Sun.COM * @param protocol sockets protocol 421*9203SMark.Logan@Sun.COM * @param backlog listening backlog 422*9203SMark.Logan@Sun.COM * @param one true if want create only one socket 423*9203SMark.Logan@Sun.COM * @return int >=0 number of created server sockets, ==-1 on error 424*9203SMark.Logan@Sun.COM */ 425*9203SMark.Logan@Sun.COM static int CreateServerSockets(ATSocketList &sockets, in_port_t port, 426*9203SMark.Logan@Sun.COM int &error, 427*9203SMark.Logan@Sun.COM bool loopback = false, bool nonblocking = true, 428*9203SMark.Logan@Sun.COM int family = ATNetworkTool::AF_XINETX, 429*9203SMark.Logan@Sun.COM int socktype = SOCK_STREAM, int protocol = 0, 430*9203SMark.Logan@Sun.COM int backlog = ATNetworkTool::DefaultBacklog, 431*9203SMark.Logan@Sun.COM bool one = false); 432*9203SMark.Logan@Sun.COM static int CreateServerSockets(ATSocketList &sockets, const char *port, 433*9203SMark.Logan@Sun.COM int &error, 434*9203SMark.Logan@Sun.COM bool loopback = false, bool nonblocking = true, 435*9203SMark.Logan@Sun.COM int family = ATNetworkTool::AF_XINETX, 436*9203SMark.Logan@Sun.COM int socktype = SOCK_STREAM, int protocol = 0, 437*9203SMark.Logan@Sun.COM int backlog = ATNetworkTool::DefaultBacklog, 438*9203SMark.Logan@Sun.COM bool one = false); 439*9203SMark.Logan@Sun.COM 440*9203SMark.Logan@Sun.COM /* Creates one server listening socket 441*9203SMark.Logan@Sun.COM * @param port listening port 442*9203SMark.Logan@Sun.COM * @param error [out] error code 443*9203SMark.Logan@Sun.COM * @param loopback true to listen only on loopback 444*9203SMark.Logan@Sun.COM * @param nonblocking true for nonblocking sockets 445*9203SMark.Logan@Sun.COM * @param family sockets expected family 446*9203SMark.Logan@Sun.COM * @param socktype sockets type 447*9203SMark.Logan@Sun.COM * @param protocol sockets protocol 448*9203SMark.Logan@Sun.COM * @param backlog listening backlog 449*9203SMark.Logan@Sun.COM * @return int !=-1 socket, ==-1 on error 450*9203SMark.Logan@Sun.COM */ 451*9203SMark.Logan@Sun.COM static int CreateServerSocket(in_port_t port, 452*9203SMark.Logan@Sun.COM int &error, 453*9203SMark.Logan@Sun.COM bool loopback = false, bool nonblocking = true, 454*9203SMark.Logan@Sun.COM int family = ATNetworkTool::AF_XINETX, 455*9203SMark.Logan@Sun.COM int socktype = SOCK_STREAM, int protocol = 0, 456*9203SMark.Logan@Sun.COM int backlog = ATNetworkTool::DefaultBacklog); 457*9203SMark.Logan@Sun.COM static int CreateServerSocket(const char *port, 458*9203SMark.Logan@Sun.COM int &error, 459*9203SMark.Logan@Sun.COM bool loopback = false, bool nonblocking = true, 460*9203SMark.Logan@Sun.COM int family = ATNetworkTool::AF_XINETX, 461*9203SMark.Logan@Sun.COM int socktype = SOCK_STREAM, int protocol = 0, 462*9203SMark.Logan@Sun.COM int backlog = ATNetworkTool::DefaultBacklog); 463*9203SMark.Logan@Sun.COM 464*9203SMark.Logan@Sun.COM /* Connects to local socket 465*9203SMark.Logan@Sun.COM * @param sock socket to connect to 466*9203SMark.Logan@Sun.COM * @param error [out] error code 467*9203SMark.Logan@Sun.COM * @param loopback true to use loopback, false to use any local address 468*9203SMark.Logan@Sun.COM * @param socktype sockets type 469*9203SMark.Logan@Sun.COM * @param protocol sockets protocol 470*9203SMark.Logan@Sun.COM * @return int !=-1 socket, ==-1 on error 471*9203SMark.Logan@Sun.COM */ 472*9203SMark.Logan@Sun.COM static int ConnectToSocket(int sock, 473*9203SMark.Logan@Sun.COM int &error, bool loopback = true, 474*9203SMark.Logan@Sun.COM int socktype = SOCK_STREAM, int protocol = 0); 475*9203SMark.Logan@Sun.COM 476*9203SMark.Logan@Sun.COM /* Connects to address 477*9203SMark.Logan@Sun.COM * @param addr destination address parameters 478*9203SMark.Logan@Sun.COM * @param error [out] error code 479*9203SMark.Logan@Sun.COM * @param loopback true to use loopback, false to use any local address 480*9203SMark.Logan@Sun.COM * @return int !=-1 socket, ==-1 on error 481*9203SMark.Logan@Sun.COM */ 482*9203SMark.Logan@Sun.COM static int ConnectSocket(struct addrinfo *addr, 483*9203SMark.Logan@Sun.COM int &error, bool loopback = false); 484*9203SMark.Logan@Sun.COM 485*9203SMark.Logan@Sun.COM /* Connects to address 486*9203SMark.Logan@Sun.COM * @param addr destination address 487*9203SMark.Logan@Sun.COM * @param addrlen socket address length 488*9203SMark.Logan@Sun.COM * @param error [out] error code 489*9203SMark.Logan@Sun.COM * @param loopback true to use loopback, false to use any local address 490*9203SMark.Logan@Sun.COM * @param family sockets expected family 491*9203SMark.Logan@Sun.COM * @param socktype sockets type 492*9203SMark.Logan@Sun.COM * @param protocol sockets protocol 493*9203SMark.Logan@Sun.COM * @return int !=-1 socket, ==-1 on error 494*9203SMark.Logan@Sun.COM */ 495*9203SMark.Logan@Sun.COM static int ConnectSocket(const struct sockaddr *addr, socklen_t addrlen, 496*9203SMark.Logan@Sun.COM int &error, bool loopback = false, 497*9203SMark.Logan@Sun.COM int family = ATNetworkTool::AF_XINETX, 498*9203SMark.Logan@Sun.COM int socktype = SOCK_STREAM, int protocol = 0); 499*9203SMark.Logan@Sun.COM 500*9203SMark.Logan@Sun.COM /* Connects to address 501*9203SMark.Logan@Sun.COM * @param hostname name of destination host 502*9203SMark.Logan@Sun.COM * @param port destination port 503*9203SMark.Logan@Sun.COM * @param error [out] error code 504*9203SMark.Logan@Sun.COM * @param family sockets expected family 505*9203SMark.Logan@Sun.COM * @param socktype sockets type 506*9203SMark.Logan@Sun.COM * @param protocol sockets protocol 507*9203SMark.Logan@Sun.COM * @return int !=-1 socket, ==-1 on error 508*9203SMark.Logan@Sun.COM */ 509*9203SMark.Logan@Sun.COM static int Connect(const char *host, in_port_t port, 510*9203SMark.Logan@Sun.COM int &error, 511*9203SMark.Logan@Sun.COM int family = ATNetworkTool::AF_XINETX, 512*9203SMark.Logan@Sun.COM int socktype = SOCK_STREAM, int protocol = 0); 513*9203SMark.Logan@Sun.COM static int Connect(const char *host, const char *port, 514*9203SMark.Logan@Sun.COM int &error, 515*9203SMark.Logan@Sun.COM int family = ATNetworkTool::AF_XINETX, 516*9203SMark.Logan@Sun.COM int socktype = SOCK_STREAM, int protocol = 0); 517*9203SMark.Logan@Sun.COM 518*9203SMark.Logan@Sun.COM /* Connects to loopback port 519*9203SMark.Logan@Sun.COM * @param port destination port 520*9203SMark.Logan@Sun.COM * @param error [out] error code 521*9203SMark.Logan@Sun.COM * @param family sockets expected family 522*9203SMark.Logan@Sun.COM * @param socktype sockets type 523*9203SMark.Logan@Sun.COM * @param protocol sockets protocol 524*9203SMark.Logan@Sun.COM * @return int !=-1 socket, ==-1 on error 525*9203SMark.Logan@Sun.COM */ 526*9203SMark.Logan@Sun.COM static int ConnectLoopback(in_port_t port, 527*9203SMark.Logan@Sun.COM int &error, 528*9203SMark.Logan@Sun.COM int family = ATNetworkTool::AF_XINETX, 529*9203SMark.Logan@Sun.COM int socktype = SOCK_STREAM, int protocol = 0); 530*9203SMark.Logan@Sun.COM static int ConnectLoopback(const char *port, 531*9203SMark.Logan@Sun.COM int &error, 532*9203SMark.Logan@Sun.COM int family = ATNetworkTool::AF_XINETX, 533*9203SMark.Logan@Sun.COM int socktype = SOCK_STREAM, int protocol = 0); 534*9203SMark.Logan@Sun.COM 535*9203SMark.Logan@Sun.COM /* Returns local port associated with socket 536*9203SMark.Logan@Sun.COM * @param sock socket 537*9203SMark.Logan@Sun.COM * @return unsigned int port number, or 0 - on error 538*9203SMark.Logan@Sun.COM */ 539*9203SMark.Logan@Sun.COM static unsigned int GetLocalPort(int sock); 540*9203SMark.Logan@Sun.COM 541*9203SMark.Logan@Sun.COM /* Accepts connection on sockets - returns address or error 542*9203SMark.Logan@Sun.COM * @param s socket accepting connection 543*9203SMark.Logan@Sun.COM * @param address [out] peer address of accepted connection 544*9203SMark.Logan@Sun.COM * @param error [out] error code 545*9203SMark.Logan@Sun.COM * @param nonblocking true for nonblocking sockets 546*9203SMark.Logan@Sun.COM * @return int !=-1 socket, ==-1 on error 547*9203SMark.Logan@Sun.COM */ 548*9203SMark.Logan@Sun.COM static int Accept(int s, ATAddress &address, 549*9203SMark.Logan@Sun.COM int &error, bool nonblocking = true); 550*9203SMark.Logan@Sun.COM }; 551*9203SMark.Logan@Sun.COM 552*9203SMark.Logan@Sun.COM #endif //_AT_NETWORK_TOOL_H_ 553*9203SMark.Logan@Sun.COM 554