1
/* $Id: sock.hpp 2394 2008-12-23 17:27:53Z bennylp $ */
3
* Copyright (C) 2008-2009 Teluu Inc. (http://www.teluu.com)
4
* Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
#ifndef __PJPP_SOCK_HPP__
21
#define __PJPP_SOCK_HPP__
24
#include <pj/string.h>
26
class Pj_Event_Handler;
29
// Base class for address.
38
class Pj_Inet_Addr : public pj_sockaddr_in, public Pj_Addr
44
pj_uint16_t get_port_number() const
46
return pj_sockaddr_in_get_port(this);
52
void set_port_number(pj_uint16_t port)
54
sin_family = PJ_AF_INET;
55
pj_sockaddr_in_set_port(this, port);
61
pj_uint32_t get_ip_address() const
63
return pj_sockaddr_in_get_addr(this).s_addr;
67
// Get address string.
69
const char *get_address() const
71
return pj_inet_ntoa(sin_addr);
77
void set_ip_address(pj_uint32_t addr)
79
sin_family = PJ_AF_INET;
80
pj_sockaddr_in_set_addr(this, addr);
86
pj_status_t set_address(const pj_str_t *addr)
88
return pj_sockaddr_in_set_str_addr(this, addr);
94
pj_status_t set_address(const char *addr)
97
return pj_sockaddr_in_set_str_addr(this, pj_cstr(&s, addr));
101
// Compare for equality.
103
bool operator==(const Pj_Inet_Addr &rhs) const
105
return sin_family == rhs.sin_family &&
106
sin_addr.s_addr == rhs.sin_addr.s_addr &&
107
sin_port == rhs.sin_port;
112
// Dummy length used in pj_ioqueue_recvfrom() etc
114
friend class Pj_Event_Handler;
115
friend class Pj_Socket;
116
friend class Pj_Sock_Stream;
117
friend class Pj_Sock_Dgram;
124
// Socket base class.
127
// socket will not automatically be closed on destructor.
133
// Default constructor.
136
: sock_(PJ_INVALID_SOCKET)
141
// Initialize from a socket handle.
143
explicit Pj_Socket(pj_sock_t sock)
151
Pj_Socket(const Pj_Socket &rhs)
157
// Destructor will not close the socket.
158
// You must call close() explicitly.
165
// Set socket handle.
167
void set_handle(pj_sock_t sock)
173
// Get socket handle.
175
pj_sock_t get_handle() const
181
// Get socket handle.
183
pj_sock_t& get_handle()
189
// See if the socket is valid.
191
bool is_valid() const
193
return sock_ != PJ_INVALID_SOCKET;
197
// Create the socket.
199
pj_status_t create(int af, int type, int proto)
201
return pj_sock_socket(af, type, proto, &sock_);
207
pj_status_t bind(const Pj_Inet_Addr &addr)
209
return pj_sock_bind(sock_, &addr, sizeof(Pj_Inet_Addr));
217
pj_sock_close(sock_);
221
// Get peer socket name.
223
pj_status_t getpeername(Pj_Inet_Addr *addr)
225
return pj_sock_getpeername(sock_, addr, &addr->addrlen_);
231
pj_status_t getsockname(Pj_Inet_Addr *addr)
233
return pj_sock_getsockname(sock_, addr, &addr->addrlen_);
239
pj_status_t getsockopt(pj_uint16_t level, pj_uint16_t optname,
240
void *optval, int *optlen)
242
return pj_sock_getsockopt(sock_, level, optname, optval, optlen);
248
pj_status_t setsockopt(pj_uint16_t level, pj_uint16_t optname,
249
const void *optval, int optlen)
251
return pj_sock_setsockopt(sock_, level, optname, optval, optlen);
257
pj_ssize_t recv(void *buf, pj_size_t len, int flag = 0)
259
pj_ssize_t bytes = len;
260
if (pj_sock_recv(sock_, buf, &bytes, flag) != PJ_SUCCESS)
268
pj_ssize_t send(const void *buf, pj_ssize_t len, int flag = 0)
270
pj_ssize_t bytes = len;
271
if (pj_sock_send(sock_, buf, &bytes, flag) != PJ_SUCCESS)
279
pj_status_t connect(const Pj_Inet_Addr &addr)
281
return pj_sock_connect(sock_, &addr, sizeof(Pj_Inet_Addr));
287
Pj_Socket &operator=(const Pj_Socket &rhs)
294
friend class Pj_Event_Handler;
303
class Pj_Sock_Stream : public Pj_Socket
307
// Default constructor.
314
// Initialize from a socket handle.
316
explicit Pj_Sock_Stream(pj_sock_t sock)
324
Pj_Sock_Stream(const Pj_Sock_Stream &rhs) : Pj_Socket(rhs)
331
Pj_Sock_Stream &operator=(const Pj_Sock_Stream &rhs)
340
pj_status_t listen(int backlog = 5)
342
return pj_sock_listen(sock_, backlog);
348
Pj_Sock_Stream accept(Pj_Inet_Addr *remote_addr = NULL)
351
int *addrlen = remote_addr ? &remote_addr->addrlen_ : NULL;
354
status = pj_sock_accept(sock_, &newsock, remote_addr, addrlen);
355
if (status != PJ_SUCCESS)
356
return Pj_Sock_Stream(-1);
358
return Pj_Sock_Stream(newsock);
364
pj_status_t shutdown(int how = PJ_SHUT_RDWR)
366
return pj_sock_shutdown(sock_, how);
375
class Pj_Sock_Dgram : public Pj_Socket
379
// Default constructor.
386
// Initialize from a socket handle.
388
explicit Pj_Sock_Dgram(pj_sock_t sock)
396
Pj_Sock_Dgram(const Pj_Sock_Dgram &rhs)
404
Pj_Sock_Dgram &operator=(const Pj_Sock_Dgram &rhs)
406
Pj_Socket::operator =(rhs);
413
pj_ssize_t recvfrom( void *buf, pj_size_t len, int flag = 0,
414
Pj_Inet_Addr *fromaddr = NULL)
416
pj_ssize_t bytes = len;
417
int *addrlen = fromaddr ? &fromaddr->addrlen_ : NULL;
418
if (pj_sock_recvfrom( sock_, buf, &bytes, flag,
419
fromaddr, addrlen) != PJ_SUCCESS)
429
pj_ssize_t sendto( const void *buf, pj_size_t len, int flag,
430
const Pj_Inet_Addr &addr)
432
pj_ssize_t bytes = len;
433
if (pj_sock_sendto( sock_, buf, &bytes, flag,
434
&addr, sizeof(pj_sockaddr_in)) != PJ_SUCCESS)
443
#endif /* __PJPP_SOCK_HPP__ */