Ignore:
Timestamp:
Nov 9, 2005 3:37:19 PM (18 years ago)
Author:
bennylp
Message:

Rework pjlib++

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/main/pjlib/include/pj++/sock.hpp

    r29 r36  
    11/* $Id$ 
    2  * 
    32 */ 
    43#ifndef __PJPP_SOCK_H__ 
     
    65 
    76#include <pj/sock.h> 
    8  
    9 class PJ_Addr 
     7#include <pj/string.h> 
     8 
     9class Pj_Event_Handler; 
     10 
     11// 
     12// Base class for address. 
     13// 
     14class Pj_Addr 
    1015{ 
    1116}; 
    1217 
    13 class PJ_INET_Addr : public pj_sockaddr_in, public PJ_Addr 
     18// 
     19// Internet address. 
     20// 
     21class Pj_Inet_Addr : public pj_sockaddr_in, public Pj_Addr 
    1422{ 
    1523public: 
     24    // 
     25    // Get port number. 
     26    // 
    1627    pj_uint16_t get_port_number() const 
    1728    { 
    18         return pj_sockaddr_get_port(this); 
    19     } 
    20  
     29        return pj_sockaddr_in_get_port(this); 
     30    } 
     31 
     32    // 
     33    // Set port number. 
     34    // 
    2135    void set_port_number(pj_uint16_t port) 
    2236    { 
    2337        sin_family = PJ_AF_INET; 
    24         pj_sockaddr_set_port(this, port); 
    25     } 
    26  
     38        pj_sockaddr_in_set_port(this, port); 
     39    } 
     40 
     41    // 
     42    // Get IP address. 
     43    // 
    2744    pj_uint32_t get_ip_address() const 
    2845    { 
    29         return pj_sockaddr_get_addr(this); 
    30     } 
    31  
     46        return pj_sockaddr_in_get_addr(this).s_addr; 
     47    } 
     48 
     49    // 
     50    // Get address string. 
     51    // 
    3252    const char *get_address() const 
    3353    { 
    34         return pj_sockaddr_get_str_addr(this); 
    35     } 
    36  
     54        return pj_inet_ntoa(sin_addr); 
     55    } 
     56 
     57    // 
     58    // Set IP address. 
     59    // 
    3760    void set_ip_address(pj_uint32_t addr) 
    3861    { 
    3962        sin_family = PJ_AF_INET; 
    40         pj_sockaddr_set_addr(this, addr); 
    41     } 
    42  
     63        pj_sockaddr_in_set_addr(this, addr); 
     64    } 
     65 
     66    // 
     67    // Set address. 
     68    // 
    4369    pj_status_t set_address(const pj_str_t *addr) 
    4470    { 
    45         return pj_sockaddr_set_str_addr(this, addr); 
    46     } 
    47  
     71        return pj_sockaddr_in_set_str_addr(this, addr); 
     72    } 
     73 
     74    // 
     75    // Set address. 
     76    // 
    4877    pj_status_t set_address(const char *addr) 
    4978    { 
    50         return pj_sockaddr_set_str_addr2(this, addr); 
    51     } 
    52  
    53     int cmp(const PJ_INET_Addr &rhs) const 
    54     { 
    55         return pj_sockaddr_cmp(this, &rhs); 
    56     } 
    57  
    58     bool operator==(const PJ_INET_Addr &rhs) const 
    59     { 
    60         return cmp(rhs) == 0; 
    61     } 
     79        pj_str_t s; 
     80        return pj_sockaddr_in_set_str_addr(this, pj_cstr(&s, addr)); 
     81    } 
     82 
     83    // 
     84    // Compare for equality. 
     85    // 
     86    bool operator==(const Pj_Inet_Addr &rhs) const 
     87    { 
     88        return sin_family == rhs.sin_family && 
     89               sin_addr.s_addr == rhs.sin_addr.s_addr && 
     90               sin_port == rhs.sin_port; 
     91    } 
     92 
     93private: 
     94    // 
     95    // Dummy length used in pj_ioqueue_recvfrom() etc 
     96    // 
     97    friend class Pj_Event_Handler; 
     98    friend class Pj_Socket; 
     99    friend class Pj_Sock_Stream; 
     100    friend class Pj_Sock_Dgram; 
     101 
     102    int addrlen_; 
    62103}; 
    63104 
    64 class PJ_Socket 
     105 
     106// 
     107// Socket base class. 
     108// 
     109// Note: 
     110//  socket will not automatically be closed on destructor. 
     111// 
     112class Pj_Socket 
    65113{ 
    66114public: 
    67     PJ_Socket() {} 
    68     PJ_Socket(const PJ_Socket &rhs) : sock_(rhs.sock_) {} 
    69  
     115    // 
     116    // Default constructor. 
     117    // 
     118    Pj_Socket() 
     119        : sock_(PJ_INVALID_SOCKET)  
     120    { 
     121    } 
     122 
     123    // 
     124    // Initialize from a socket handle. 
     125    // 
     126    explicit Pj_Socket(pj_sock_t sock) 
     127        : sock_(sock) 
     128    { 
     129    } 
     130 
     131    // 
     132    // Copy constructor. 
     133    // 
     134    Pj_Socket(const Pj_Socket &rhs)  
     135        : sock_(rhs.sock_)  
     136    { 
     137    } 
     138 
     139    // 
     140    // Destructor will not close the socket. 
     141    // You must call close() explicitly. 
     142    // 
     143    ~Pj_Socket() 
     144    { 
     145    } 
     146 
     147    // 
     148    // Set socket handle. 
     149    // 
    70150    void set_handle(pj_sock_t sock) 
    71151    { 
     
    73153    } 
    74154 
     155    // 
     156    // Get socket handle. 
     157    // 
    75158    pj_sock_t get_handle() const 
    76159    { 
     
    78161    } 
    79162 
     163    // 
     164    // Get socket handle. 
     165    // 
    80166    pj_sock_t& get_handle() 
    81167    { 
     
    83169    } 
    84170 
    85     bool socket(int af, int type, int proto, pj_uint32_t flag=0) 
    86     { 
    87         sock_ = pj_sock_socket(af, type, proto, flag); 
    88         return sock_ != -1; 
    89     } 
    90  
    91     bool bind(const PJ_INET_Addr &addr) 
    92     { 
    93         return pj_sock_bind(sock_, &addr, sizeof(PJ_INET_Addr)) == 0; 
    94     } 
    95  
    96     bool close() 
    97     { 
    98         return pj_sock_close(sock_) == 0; 
    99     } 
    100  
    101     bool getpeername(PJ_INET_Addr *addr) 
    102     { 
    103         int namelen; 
    104         return pj_sock_getpeername(sock_, addr, &namelen) == 0; 
    105     } 
    106  
    107     bool getsockname(PJ_INET_Addr *addr) 
    108     { 
    109         int namelen; 
    110         return pj_sock_getsockname(sock_, addr, &namelen) == 0; 
    111     } 
    112  
    113     bool getsockopt(int level, int optname, void *optval, int *optlen) 
    114     { 
    115         return pj_sock_getsockopt(sock_, level, optname, optval, optlen) == 0; 
    116     } 
    117  
    118     bool setsockopt(int level, int optname, const void *optval, int optlen) 
    119     { 
    120         return pj_sock_setsockopt(sock_, level, optname, optval, optlen) == 0; 
    121     } 
    122  
    123     bool ioctl(long cmd, pj_uint32_t *val) 
    124     { 
    125         return pj_sock_ioctl(sock_, cmd, val) == 0; 
    126     } 
    127  
    128     int recv(void *buf, int len, int flag = 0) 
    129     { 
    130         return pj_sock_recv(sock_, buf, len, flag); 
    131     } 
    132  
    133     int send(const void *buf, int len, int flag = 0) 
    134     { 
    135         return pj_sock_send(sock_, buf, len, flag); 
     171    // 
     172    // See if the socket is valid. 
     173    // 
     174    bool is_valid() const 
     175    { 
     176        return sock_ != PJ_INVALID_SOCKET; 
     177    } 
     178 
     179    // 
     180    // Create the socket. 
     181    // 
     182    pj_status_t create(int af, int type, int proto) 
     183    { 
     184        return pj_sock_socket(af, type, proto, &sock_); 
     185    } 
     186 
     187    // 
     188    // Bind socket. 
     189    // 
     190    pj_status_t bind(const Pj_Inet_Addr &addr) 
     191    { 
     192        return pj_sock_bind(sock_, &addr, sizeof(Pj_Inet_Addr)); 
     193    } 
     194 
     195    // 
     196    // Close socket. 
     197    // 
     198    pj_status_t close() 
     199    { 
     200        pj_sock_close(sock_); 
     201    } 
     202 
     203    // 
     204    // Get peer socket name. 
     205    // 
     206    pj_status_t getpeername(Pj_Inet_Addr *addr) 
     207    { 
     208        return pj_sock_getpeername(sock_, addr, &addr->addrlen_); 
     209    } 
     210 
     211    // 
     212    // getsockname 
     213    // 
     214    pj_status_t getsockname(Pj_Inet_Addr *addr) 
     215    { 
     216        return pj_sock_getsockname(sock_, addr, &addr->addrlen_); 
     217    } 
     218 
     219    // 
     220    // getsockopt. 
     221    // 
     222    pj_status_t getsockopt(int level, int optname,  
     223                           void *optval, int *optlen) 
     224    { 
     225        return pj_sock_getsockopt(sock_, level, optname, optval, optlen); 
     226    } 
     227 
     228    // 
     229    // setsockopt 
     230    //  
     231    pj_status_t setsockopt(int level, int optname,  
     232                           const void *optval, int optlen) 
     233    { 
     234        return pj_sock_setsockopt(sock_, level, optname, optval, optlen); 
     235    } 
     236 
     237    // 
     238    // receive data. 
     239    // 
     240    pj_ssize_t recv(void *buf, pj_size_t len, int flag = 0) 
     241    { 
     242        pj_ssize_t bytes = len; 
     243        if (pj_sock_recv(sock_, buf, &bytes, flag) != PJ_SUCCESS) 
     244            return -1; 
     245        return bytes; 
     246    } 
     247 
     248    // 
     249    // send data. 
     250    // 
     251    pj_ssize_t send(const void *buf, pj_ssize_t len, int flag = 0) 
     252    { 
     253        pj_ssize_t bytes = len; 
     254        if (pj_sock_send(sock_, buf, &bytes, flag) != PJ_SUCCESS) 
     255            return -1; 
     256        return bytes; 
     257    } 
     258 
     259    // 
     260    // connect. 
     261    // 
     262    pj_status_t connect(const Pj_Inet_Addr &addr) 
     263    { 
     264        return pj_sock_connect(sock_, &addr, sizeof(Pj_Inet_Addr)); 
     265    } 
     266 
     267    // 
     268    // assignment. 
     269    // 
     270    Pj_Socket &operator=(const Pj_Socket &rhs) 
     271    { 
     272        sock_ = rhs.sock_; 
     273        return *this; 
    136274    } 
    137275 
    138276protected: 
     277    friend class Pj_Event_Handler; 
    139278    pj_sock_t sock_; 
    140279}; 
    141280 
     281 
    142282#if PJ_HAS_TCP 
    143 class PJ_Sock_Stream : public PJ_Socket 
     283// 
     284// Stream socket. 
     285// 
     286class Pj_Sock_Stream : public Pj_Socket 
    144287{ 
    145288public: 
    146     PJ_Sock_Stream() {} 
    147     PJ_Sock_Stream(const PJ_Sock_Stream &rhs) : PJ_Socket(rhs) {} 
    148     PJ_Sock_Stream &operator=(const PJ_Sock_Stream &rhs) { sock_ = rhs.sock_; return *this; } 
    149  
    150     bool listen(int backlog = 5) 
    151     { 
    152         return pj_sock_listen(sock_, backlog) == 0; 
    153     } 
    154  
    155     bool accept(PJ_Sock_Stream *new_sock, PJ_INET_Addr *addr, int *addrlen) 
    156     { 
    157         pj_sock_t s = pj_sock_accept(sock_, addr, addrlen); 
    158         if (s == -1) 
    159             return false; 
    160         new_sock->set_handle(s); 
    161         return true; 
    162     } 
    163  
    164     bool connect(const PJ_INET_Addr &addr) 
    165     { 
    166         return pj_sock_connect(sock_, &addr, sizeof(PJ_INET_Addr)) == 0; 
    167     } 
    168  
    169     bool shutdown(int how) 
    170     { 
    171         return pj_sock_shutdown(sock_, how) == 0; 
     289    // 
     290    // Default constructor. 
     291    // 
     292    Pj_Sock_Stream()  
     293    { 
     294    } 
     295 
     296    // 
     297    // Initialize from a socket handle. 
     298    // 
     299    explicit Pj_Sock_Stream(pj_sock_t sock) 
     300        : Pj_Socket(sock) 
     301    { 
     302    } 
     303 
     304    // 
     305    // Copy constructor. 
     306    // 
     307    Pj_Sock_Stream(const Pj_Sock_Stream &rhs) : Pj_Socket(rhs)  
     308    { 
     309    } 
     310 
     311    // 
     312    // Assignment. 
     313    // 
     314    Pj_Sock_Stream &operator=(const Pj_Sock_Stream &rhs)  
     315    {  
     316        sock_ = rhs.sock_;  
     317        return *this;  
     318    } 
     319 
     320    // 
     321    // listen() 
     322    // 
     323    pj_status_t listen(int backlog = 5) 
     324    { 
     325        return pj_sock_listen(sock_, backlog); 
     326    } 
     327 
     328    // 
     329    // blocking accept() 
     330    // 
     331    Pj_Sock_Stream accept(Pj_Inet_Addr *remote_addr = NULL) 
     332    { 
     333        pj_sock_t newsock; 
     334        int *addrlen = remote_addr ? &remote_addr->addrlen_ : NULL; 
     335        pj_status_t status; 
     336         
     337        status = pj_sock_accept(sock_, &newsock, remote_addr, addrlen); 
     338        if (status != PJ_SUCCESS) 
     339            return Pj_Sock_Stream(-1); 
     340 
     341        return Pj_Sock_Stream(newsock); 
     342    } 
     343 
     344    // 
     345    // shutdown() 
     346    // 
     347    pj_status_t shutdown(int how = PJ_SHUT_RDWR) 
     348    { 
     349        return pj_sock_shutdown(sock_, how); 
    172350    } 
    173351 
     
    175353#endif 
    176354 
    177 class PJ_Sock_Dgram : public PJ_Socket 
     355// 
     356// Datagram socket. 
     357// 
     358class Pj_Sock_Dgram : public Pj_Socket 
    178359{ 
    179360public: 
    180     PJ_Sock_Dgram() {} 
    181     PJ_Sock_Dgram(const PJ_Sock_Dgram &rhs) : PJ_Socket(rhs) {} 
    182     PJ_Sock_Dgram &operator=(const PJ_Sock_Dgram &rhs) { sock_ = rhs.sock_; return *this; } 
    183  
    184     int recvfrom(void *buf, int len, int flag, PJ_INET_Addr *fromaddr) 
    185     { 
    186         int addrlen; 
    187         return pj_sock_recvfrom(sock_, buf, len, flag, fromaddr, &addrlen); 
    188     } 
    189  
    190     int sendto(const void *buf, int len, int flag, const PJ_INET_Addr &addr) 
    191     { 
    192         return pj_sock_sendto(sock_, buf, len, flag, &addr, sizeof(PJ_INET_Addr)); 
     361    // 
     362    // Default constructor. 
     363    // 
     364    Pj_Sock_Dgram()  
     365    { 
     366    } 
     367 
     368    // 
     369    // Initialize from a socket handle. 
     370    // 
     371    explicit Pj_Sock_Dgram(pj_sock_t sock) 
     372        : Pj_Socket(sock) 
     373    { 
     374    } 
     375 
     376    // 
     377    // Copy constructor. 
     378    // 
     379    Pj_Sock_Dgram(const Pj_Sock_Dgram &rhs)  
     380        : Pj_Socket(rhs)  
     381    { 
     382    } 
     383 
     384    // 
     385    // Assignment. 
     386    // 
     387    Pj_Sock_Dgram &operator=(const Pj_Sock_Dgram &rhs)  
     388    {  
     389        Pj_Socket::operator =(rhs); 
     390        return *this;  
     391    } 
     392 
     393    // 
     394    // recvfrom() 
     395    // 
     396    pj_ssize_t recvfrom( void *buf, pj_size_t len, int flag = 0,  
     397                         Pj_Inet_Addr *fromaddr = NULL) 
     398    { 
     399        pj_ssize_t bytes = len; 
     400        int *addrlen = fromaddr ? &fromaddr->addrlen_ : NULL; 
     401        if (pj_sock_recvfrom( sock_, buf, &bytes, flag,  
     402                              fromaddr, addrlen) != PJ_SUCCESS) 
     403        { 
     404            return -1; 
     405        } 
     406        return bytes; 
     407    } 
     408 
     409    // 
     410    // sendto() 
     411    // 
     412    pj_ssize_t sendto( const void *buf, pj_size_t len, int flag,  
     413                       const Pj_Inet_Addr &addr) 
     414    { 
     415        pj_ssize_t bytes = len; 
     416        if (pj_sock_sendto( sock_, buf, &bytes, flag,  
     417                            &addr, sizeof(pj_sockaddr_in)) != PJ_SUCCESS) 
     418        { 
     419            return -1; 
     420        } 
     421        return bytes; 
    193422    } 
    194423}; 
    195424 
     425 
    196426#endif  /* __PJPP_SOCK_H__ */ 
Note: See TracChangeset for help on using the changeset viewer.