Changeset 36 for pjproject/main/pjlib/include/pj++/sock.hpp
- Timestamp:
- Nov 9, 2005 3:37:19 PM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/main/pjlib/include/pj++/sock.hpp
r29 r36 1 1 /* $Id$ 2 *3 2 */ 4 3 #ifndef __PJPP_SOCK_H__ … … 6 5 7 6 #include <pj/sock.h> 8 9 class PJ_Addr 7 #include <pj/string.h> 8 9 class Pj_Event_Handler; 10 11 // 12 // Base class for address. 13 // 14 class Pj_Addr 10 15 { 11 16 }; 12 17 13 class PJ_INET_Addr : public pj_sockaddr_in, public PJ_Addr 18 // 19 // Internet address. 20 // 21 class Pj_Inet_Addr : public pj_sockaddr_in, public Pj_Addr 14 22 { 15 23 public: 24 // 25 // Get port number. 26 // 16 27 pj_uint16_t get_port_number() const 17 28 { 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 // 21 35 void set_port_number(pj_uint16_t port) 22 36 { 23 37 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 // 27 44 pj_uint32_t get_ip_address() const 28 45 { 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 // 32 52 const char *get_address() const 33 53 { 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 // 37 60 void set_ip_address(pj_uint32_t addr) 38 61 { 39 62 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 // 43 69 pj_status_t set_address(const pj_str_t *addr) 44 70 { 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 // 48 77 pj_status_t set_address(const char *addr) 49 78 { 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 93 private: 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_; 62 103 }; 63 104 64 class PJ_Socket 105 106 // 107 // Socket base class. 108 // 109 // Note: 110 // socket will not automatically be closed on destructor. 111 // 112 class Pj_Socket 65 113 { 66 114 public: 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 // 70 150 void set_handle(pj_sock_t sock) 71 151 { … … 73 153 } 74 154 155 // 156 // Get socket handle. 157 // 75 158 pj_sock_t get_handle() const 76 159 { … … 78 161 } 79 162 163 // 164 // Get socket handle. 165 // 80 166 pj_sock_t& get_handle() 81 167 { … … 83 169 } 84 170 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; 136 274 } 137 275 138 276 protected: 277 friend class Pj_Event_Handler; 139 278 pj_sock_t sock_; 140 279 }; 141 280 281 142 282 #if PJ_HAS_TCP 143 class PJ_Sock_Stream : public PJ_Socket 283 // 284 // Stream socket. 285 // 286 class Pj_Sock_Stream : public Pj_Socket 144 287 { 145 288 public: 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); 172 350 } 173 351 … … 175 353 #endif 176 354 177 class PJ_Sock_Dgram : public PJ_Socket 355 // 356 // Datagram socket. 357 // 358 class Pj_Sock_Dgram : public Pj_Socket 178 359 { 179 360 public: 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; 193 422 } 194 423 }; 195 424 425 196 426 #endif /* __PJPP_SOCK_H__ */
Note: See TracChangeset
for help on using the changeset viewer.