sockaddr.h
上传用户:psq1974
上传日期:2007-01-06
资源大小:1195k
文件大小:3k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. /* Copyright (C) 1998, 1999 State University of New York at Stony Brook
  2.    Author: Andrew V. Shuvalov ( andrew@ecsl.cs.sunysb.edu )
  3.    Software license is located in file "COPYING"
  4. */
  5. #ifndef _sockaddr_h_
  6. #define _sockaddr_h_
  7. #ifndef _WIN32
  8. # include <sys/socket.h>
  9. # include <netinet/in.h> 
  10. # include <netdb.h>
  11. # include <arpa/inet.h>
  12. #endif
  13. #include <ostream.h>
  14. #include <string> 
  15. #ifdef _WIN32
  16. # define STD std:: 
  17. #else
  18. # define STD /* */
  19. #endif
  20. #ifdef _WIN32
  21. # define snprintf _snprintf
  22. #endif
  23. //! author="Andrew V. Shuvalov"
  24. /** hides all operations with struct sockaddr_in 
  25.  */
  26. class Sockaddr {
  27. public:
  28.   sockaddr_in addr;
  29. public:
  30.   Sockaddr() 
  31.     {
  32.       addr.sin_family = 0;
  33.       addr.sin_port = 0;
  34.     }
  35.   Sockaddr( const Sockaddr &a ) 
  36.     {
  37.       *this = a;
  38.     }
  39.   Sockaddr( const STD string &hostname, const STD string &s_port )
  40.     {
  41.       int port = 0;
  42.       sscanf( s_port.c_str(), "%d", &port );
  43.       construct( hostname, port );
  44.     }
  45.   /** construct from hostname or numeric IP address and optional
  46.       port number */
  47.   Sockaddr( const STD string &hostname, int port = 0 )
  48.     {
  49.       construct( hostname, port );
  50.     }
  51.   void construct( const STD string &hostname, int port = 0 )
  52.     {
  53.       addr.sin_family = AF_INET;
  54.       // detect if site is hostname or ip addr
  55.       if( hostname[0] < '0' || hostname[0] > '9' )
  56. {
  57.   // hostname
  58.   struct hostent *he = gethostbyname( hostname.c_str() );
  59.   if( he == NULL )
  60.     {
  61.       perror( "gethostbyname" );
  62.       return;
  63.     }
  64.   addr.sin_addr = *(struct in_addr *) he->h_addr;
  65. }
  66.       else
  67. {
  68.   // just numbers of IP address
  69. #         ifndef _WIN32
  70.   if( !inet_aton( hostname.c_str(), &addr.sin_addr ))
  71.     {
  72.       perror( "Error converting inet_aton" );
  73.       return;
  74.     }
  75. #         else
  76.   {
  77.     // windoze don't have inet_aton function
  78.     unsigned long int ia = inet_addr( hostname.c_str() );
  79.     if( ia == INADDR_NONE )
  80.       {
  81. perror( "Error converting inet_aton" );
  82. return;
  83.       }
  84.     addr.sin_addr.s_addr = ia;
  85.   }
  86. #         endif
  87. }
  88.       // non-zero port will indicate non-error
  89.       addr.sin_port = htons( port );
  90.     }
  91.   const Sockaddr &operator =( const Sockaddr &a ) {
  92.     if( this != &a ) {
  93.       addr = a.addr;
  94.     }
  95.     return *this;
  96.   }
  97.   bool operator <( const Sockaddr &a ) const {
  98.     if( addr.sin_port == a.addr.sin_port )
  99.       {
  100. if( addr.sin_addr.s_addr < a.addr.sin_addr.s_addr )
  101.   return true;
  102. else
  103.   return false;
  104.       }
  105.     else
  106.       {
  107. if( addr.sin_port < a.addr.sin_port )
  108.   return true;
  109. else
  110.   return false;
  111.       }
  112.   }
  113.   bool operator ==( const Sockaddr &a ) const {
  114.     if( addr.sin_port == a.addr.sin_port )
  115.       if( addr.sin_addr.s_addr == a.addr.sin_addr.s_addr )
  116. return true;
  117.     return false;
  118.   }
  119.   STD string get_description() const {
  120.     char buf[100];
  121.     snprintf( buf, 100, "addr 0x%x port %d", ntohl( addr.sin_addr.s_addr ),
  122.       ntohs( addr.sin_port ) );
  123.     return STD string( buf );
  124.   }
  125. };
  126. /** prints itself */
  127. inline ostream &operator <<( ostream &os, const Sockaddr &a )
  128. {
  129.   char buf[100];
  130.   snprintf( buf, 100, "addr 0x%x port %d", ntohl( a.addr.sin_addr.s_addr ),
  131.     ntohs( a.addr.sin_port ) );
  132.   os << buf;
  133.   return os;
  134. }
  135. #endif // _sockaddr_h_