libsocket  1.5
Network::Socket Class Referenceabstract

This class represent an abstract socket connection (udp | tcp server | tcp client) More...

#include <socket.hh>

Inheritance diagram for Network::Socket:
Network::LocalSocket Network::NetSocket Network::TcpSocket Network::UdpSocket

Public Member Functions

 Socket (SOCKET_KIND kind, SOCKET_VERSION version=V4)
 
 Socket (SOCKET_KIND kind, PROTO_KIND pkind, SOCKET_VERSION version=V4)
 
virtual ~Socket ()
 
void write (const std::string &str)
 function used by << operator (write a string on current socket) More...
 
bool connected () const
 return true when socket is connected More...
 
int get_socket ()
 get socket (fd) warning: be very carefull with this method More...
 
void add_delim (const std::string &delim)
 set the delimitor for the text mode More...
 
void del_delim (const std::string &delim)
 delete this delimitor for the socket More...
 
void allow_empty_lines ()
 , if set, empty lines will be returned in text procols (if not, they are skipped) More...
 
void init_tls (GnuTLSKind kind, unsigned size=1024, const std::string &certfile="", const std::string &keyfile="", const std::string &trustfile="", const std::string &crlfile="")
 
Exceptions
TLSSupportErrorwhen TLS is not enabled
More...
 
void enable_tls ()
 Enable TLS on socket. More...
 
virtual std::string read ()=0
 function used by >> operator (read a string on current socket) More...
 
virtual std::string read (int timeout)=0
 read a string with a timeout More...
 
virtual std::string readn (unsigned int size)=0
 read a string from socket More...
 
virtual std::string readn (int timeout, unsigned int size)=0
 read a string with a timeout More...
 

Protected Member Functions

void _close (int socket) const
 Close a connnection

Exceptions
CloseExceptionwhen close libc function return a negative value.
More...
 
void _listen (int socket) const
 Listen on port

Exceptions
ListenExceptionwhen listen libc function return a negative value.
More...
 
virtual std::string _read_line (int socket)=0
 Get a line from socket (when used with textual protocol)

Exceptions
NoConnectionwhen there is no open socket
ConnectionClosedwhen there is no more connection.
More...
 
virtual std::string _read_line_bin (int socket, unsigned int size)=0
 Get a line from socket (when used with binary protocol)

Exceptions
NoConnectionwhen there is no open socket
ConnectionClosedwhen there is no more connection.
More...
 
void _write_str (int socket, const std::string &str) const
 Write a string to a socket (when used with textual protocol)

Exceptions
NoConnectionwhen there is no open socket
ConnectionClosedwhen there is no more connection.
More...
 
void _write_str_bin (int socket, const std::string &str) const
 Write a string to a socket (when used with binary protocol)

Exceptions
NoConnectionwhen there is no open socket
ConnectionClosedwhen there is no more connection.
More...
 
void _set_timeout (bool enable, int socket, int timeout)
 set a timeout on a socket More...
 
std::pair< int, int > _find_delim (const std::string &str, int start) const
 
bool _update_buffer (std::pair< int, int > &delim, int &i, std::string &str)
 look delimiter and remove delimiter at begining of buffer if needed More...
 
bool _check_answer (int res, std::string &str)
 return the content of the buffer is there is More...
 

Protected Attributes

SOCKET_KIND _kind
 
SOCKET_VERSION _version
 
unsigned _state_timeout
 
int _socket
 
int _recv_flags
 
struct sockaddr_in _addr
 
PROTO_KIND _proto_kind
 
std::list< std::string > _delim
 
bool _empty_lines
 
std::string _buffer
 
bool _tls
 

Detailed Description

This class represent an abstract socket connection (udp | tcp server | tcp client)

Author
Julien Lemoine <speedblue at="" happycoders="" dot="" org>="">

Definition at line 100 of file socket.hh.

Constructor & Destructor Documentation

Network::Socket::Socket ( SOCKET_KIND  kind,
SOCKET_VERSION  version = V4 
)

Definition at line 31 of file socket.cc.

References _delim, HERE, and Network::V6.

31  :
32  _kind(kind), _version(version), _state_timeout(0),
33  _socket(0), _recv_flags(kind), _proto_kind(text), _empty_lines(false),
34  _buffer(""), _tls(false)
35  {
36  _delim.push_back("\0");
37 #ifdef LIBSOCKET_WIN
38  WSADATA wsadata;
39  if (WSAStartup(MAKEWORD(1, 1), &wsadata) != 0)
40  throw WSAStartupError("WSAStartup failed", HERE);
41 #endif
42 #ifndef IPV6_ENABLED
43  if (version == V6)
44  throw Ipv6SupportError("lib was not compiled with ipv6 support", HERE);
45 #endif
46  }
std::string _buffer
Definition: socket.hh:202
PROTO_KIND _proto_kind
Definition: socket.hh:199
unsigned _state_timeout
Definition: socket.hh:192
std::list< std::string > _delim
Definition: socket.hh:200
bool _empty_lines
Definition: socket.hh:201
SOCKET_VERSION _version
Definition: socket.hh:191
SOCKET_KIND _kind
Definition: socket.hh:190
#define HERE
Network::Socket::Socket ( SOCKET_KIND  kind,
PROTO_KIND  pkind,
SOCKET_VERSION  version = V4 
)

Definition at line 48 of file socket.cc.

References _delim, HERE, and Network::V6.

48  :
49  _kind(kind), _version(version), _state_timeout(0),
50  _socket(0), _recv_flags(kind), _proto_kind(pkind), _empty_lines(false),
51  _buffer(""), _tls(false)
52  {
53  _delim.push_back("\0");
54 #ifdef LIBSOCKET_WIN
55  WSADATA wsadata;
56  if (WSAStartup(MAKEWORD(1, 1), &wsadata) != 0)
57  throw WSAStartupError("WSAStartup failed", HERE);
58 #endif
59 #ifndef IPV6_ENABLED
60  if (version == V6)
61  throw Ipv6SupportError("lib was not compiled with ipv6 support", HERE);
62 #endif
63  }
std::string _buffer
Definition: socket.hh:202
PROTO_KIND _proto_kind
Definition: socket.hh:199
unsigned _state_timeout
Definition: socket.hh:192
std::list< std::string > _delim
Definition: socket.hh:200
bool _empty_lines
Definition: socket.hh:201
SOCKET_VERSION _version
Definition: socket.hh:191
SOCKET_KIND _kind
Definition: socket.hh:190
#define HERE
Network::Socket::~Socket ( )
virtual

Definition at line 65 of file socket.cc.

66  {
67  }

Member Function Documentation

bool Network::Socket::_check_answer ( int  res,
std::string &  str 
)
inlineprotected

return the content of the buffer is there is

Definition at line 28 of file socket.hxx.

References _buffer, _state_timeout, and HERE.

Referenced by Network::NetSocket::_read_line().

29  {
30  if (res <= 0)
31  {
32  if (!_buffer.size()) // No more data...
33  throw ConnectionClosed("Connection Closed", HERE);
34  else
35  {
36  str += _buffer;
37  _buffer = "";
38  _state_timeout = 0;
39  return true;
40  }
41  }
42  return false;
43  }
std::string _buffer
Definition: socket.hh:202
unsigned _state_timeout
Definition: socket.hh:192
#define HERE
void Network::Socket::_close ( int  socket) const
protected

Close a connnection

Exceptions
CloseExceptionwhen close libc function return a negative value.

Definition at line 167 of file socket.cc.

References _tls, and HERE.

Referenced by Network::UdpSocket::close(), Network::TcpSocket::close(), and Network::LocalSocket::close().

168  {
169 #ifndef LIBSOCKET_WIN
170  if (socket < 0 || close(socket) < 0)
171  throw CloseError("Close Error", HERE);
172  socket = 0;
173 #else
174  if (socket < 0 || closesocket(socket) < 0)
175  throw CloseError("Close Error", HERE);
176  socket = 0;
177 #endif
178 #ifdef TLS
179  if (_tls)
180  {
181  std::cout << "Deletion..." << std::endl;
182  gnutls_deinit(_session);
183  if (_tls_main)
184  {
185  gnutls_certificate_free_credentials(_x509_cred);
186  gnutls_global_deinit();
187  }
188  }
189 #endif
190  }
#define HERE
std::pair< int, int > Network::Socket::_find_delim ( const std::string &  str,
int  start 
) const
protected

Definition at line 339 of file socket.cc.

References _delim.

Referenced by _update_buffer().

340  {
341  int i = -1;
342  int pos = -1, size = 0;
343  std::list<std::string>::const_iterator it;
344 
345  // Looking for the first delimiter.
346  if (_delim.size() > 0)
347  {
348  it = _delim.begin();
349  while (it != _delim.end())
350  {
351  if (*it == "")
352  i = str.find('\0', start);
353  else
354  i = str.find(*it, start);
355  if ((i >= 0) && ((unsigned int)i < str.size()) &&
356  (pos < 0 || i < pos))
357  {
358  pos = i;
359  size = it->size() ? it->size() : 1;
360  }
361  it++;
362  }
363  }
364  return std::pair<int, int>(pos, size);
365  }
std::list< std::string > _delim
Definition: socket.hh:200
void Network::Socket::_listen ( int  socket) const
protected

Listen on port

Exceptions
ListenExceptionwhen listen libc function return a negative value.

Definition at line 192 of file socket.cc.

References HERE.

Referenced by Network::TcpSocket::connect().

193  {
194  if (socket < 0 || listen(socket, 5) < 0)
195  throw ListenError("Listen Error", HERE);
196  }
#define HERE
virtual std::string Network::Socket::_read_line ( int  socket)
protectedpure virtual

Get a line from socket (when used with textual protocol)

Exceptions
NoConnectionwhen there is no open socket
ConnectionClosedwhen there is no more connection.

Implemented in Network::LocalSocket, and Network::NetSocket.

virtual std::string Network::Socket::_read_line_bin ( int  socket,
unsigned int  size 
)
protectedpure virtual

Get a line from socket (when used with binary protocol)

Exceptions
NoConnectionwhen there is no open socket
ConnectionClosedwhen there is no more connection.

Implemented in Network::LocalSocket, Network::TcpSocket, Network::UdpSocket, and Network::NetSocket.

void Network::Socket::_set_timeout ( bool  enable,
int  socket,
int  timeout 
)
protected

set a timeout on a socket

Parameters
timeoutis in second
Exceptions
Timeoutwhen there is a timeout
SelectErrorwhen select libc function return a negative value

Definition at line 272 of file socket.cc.

References HERE.

Referenced by Network::NetSocket::_read_line(), Network::LocalSocket::read(), Network::NetSocket::read(), Network::LocalSocket::readn(), and Network::NetSocket::readn().

273  {
274  fd_set fdset;
275  struct timeval timetowait;
276  int res;
277 
278  if (enable)
279  timetowait.tv_sec = timeout;
280  else
281  timetowait.tv_sec = 65535;
282  timetowait.tv_usec = 0;
283  FD_ZERO(&fdset);
284  FD_SET(socket, &fdset);
285  if (enable)
286  res = select(socket + 1, &fdset, NULL, NULL, &timetowait);
287  else
288  res = select(socket + 1, &fdset, NULL, NULL, NULL);
289  if (res < 0)
290  throw SelectError("Select error", HERE);
291  if (res == 0)
292  throw Timeout("Timeout on socket", HERE);
293  }
#define HERE
bool Network::Socket::_update_buffer ( std::pair< int, int > &  delim,
int &  i,
std::string &  str 
)
inlineprotected

look delimiter and remove delimiter at begining of buffer if needed

Definition at line 45 of file socket.hxx.

References _buffer, _empty_lines, and _find_delim().

Referenced by Network::NetSocket::_read_line(), and Network::LocalSocket::_read_line().

47  {
48  delim = _find_delim(_buffer, 0);
49  i = delim.first;
50  while (!_empty_lines && !i)
51  {
52  // remove delimiter in front of buffer
53  _buffer = _buffer.substr(delim.second, _buffer.size() - delim.second);
54  delim = _find_delim(_buffer, 0);
55  i = delim.first;
56  }
57  if ((i > 0 || _empty_lines) && ((unsigned int)i < _buffer.size()))
58  {
59  str = _buffer.substr(0, i);
60  _buffer = _buffer.substr(i + delim.second,
61  _buffer.size() - i - delim.second);
62  return true;
63  }
64  else
65  return false;
66  }
std::string _buffer
Definition: socket.hh:202
bool _empty_lines
Definition: socket.hh:201
std::pair< int, int > _find_delim(const std::string &str, int start) const
Definition: socket.cc:339
void Network::Socket::_write_str ( int  socket,
const std::string &  str 
) const
protected

Write a string to a socket (when used with textual protocol)

Exceptions
NoConnectionwhen there is no open socket
ConnectionClosedwhen there is no more connection.

Definition at line 198 of file socket.cc.

References _addr, _tls, _version, HERE, SENDTO_FLAGS, and Network::V4.

Referenced by write().

199  {
200  int res = 1;
201  unsigned int count = 0;
202  const char *buf;
203 
204  buf = str.c_str();
205  if (socket < 0)
206  throw NoConnection("No Socket", HERE);
207  while (res && count < str.size())
208  {
209 #ifdef IPV6_ENABLED
210  if (V4 == _version)
211 #endif
212 #ifdef TLS
213  if (_tls)
214  res = gnutls_record_send(_session, buf + count, str.size() - count);
215  else
216 #endif
217  res = sendto(socket, buf + count, str.size() - count, SENDTO_FLAGS,
218  (const struct sockaddr*)&_addr, sizeof(_addr));
219 #ifdef IPV6_ENABLED
220  else
221  res = sendto(socket, buf + count, str.size() - count, SENDTO_FLAGS,
222  (const struct sockaddr*)&_addr6, sizeof(_addr6));
223 #endif
224  if (res <= 0)
225  throw ConnectionClosed("Connection Closed", HERE);
226  count += res;
227  }
228  }
struct sockaddr_in _addr
Definition: socket.hh:195
#define SENDTO_FLAGS
Definition: socket.hh:48
SOCKET_VERSION _version
Definition: socket.hh:191
#define HERE
void Network::Socket::_write_str_bin ( int  socket,
const std::string &  str 
) const
protected

Write a string to a socket (when used with binary protocol)

Exceptions
NoConnectionwhen there is no open socket
ConnectionClosedwhen there is no more connection.

Definition at line 230 of file socket.cc.

References _addr, _tls, _version, HERE, SENDTO_FLAGS, and Network::V4.

Referenced by write().

231  {
232  int res = 1;
233  unsigned int count = 0;
234 #ifdef LIBSOCKET_WIN
235  char* buf = new char[str.size() + 2];
236 #else
237  char buf[str.size() + 2];
238 #endif
239  buf[0] = str.size() / 256;
240  buf[1] = str.size() % 256;
241  memcpy(buf + 2, str.c_str(), str.size());
242  if (socket < 0)
243  throw NoConnection("No Socket", HERE);
244  while (res && count < str.size() + 2)
245  {
246 #ifdef IPV6_ENABLED
247  if (V4 == _version)
248 #endif
249 #ifdef TLS
250  if (_tls)
251  res = gnutls_record_send(_session, buf + count, str.size() + 2 - count);
252  else
253 #endif
254  res = sendto(socket, buf + count, str.size() + 2 - count,
255  SENDTO_FLAGS,
256  (const struct sockaddr*)&_addr, sizeof(_addr));
257 #ifdef IPV6_ENABLED
258  else
259  res = sendto(socket, buf + count, str.size() + 2 - count,
261  (const struct sockaddr*)&_addr6, sizeof(_addr6));
262 #endif
263  if (res <= 0)
264  throw ConnectionClosed("Connection Closed", HERE);
265  count += res;
266  }
267 #ifdef LIBSOCKET_WIN
268  delete[] buf;
269 #endif
270  }
struct sockaddr_in _addr
Definition: socket.hh:195
#define SENDTO_FLAGS
Definition: socket.hh:48
SOCKET_VERSION _version
Definition: socket.hh:191
#define HERE
void Network::Socket::add_delim ( const std::string &  delim)

set the delimitor for the text mode

Definition at line 318 of file socket.cc.

References _delim.

319  {
320  _delim.push_back(delim);
321  }
std::list< std::string > _delim
Definition: socket.hh:200
void Network::Socket::allow_empty_lines ( )

, if set, empty lines will be returned in text procols (if not, they are skipped)

Definition at line 308 of file socket.cc.

References _empty_lines.

309  {
310  _empty_lines = true;
311  }
bool _empty_lines
Definition: socket.hh:201
bool Network::Socket::connected ( ) const

return true when socket is connected

Definition at line 303 of file socket.cc.

References _socket.

Referenced by enable_tls().

304  {
305  return _socket != 0;
306  }
void Network::Socket::del_delim ( const std::string &  delim)

delete this delimitor for the socket

Definition at line 323 of file socket.cc.

References _delim.

324  {
325  std::list<std::string>::iterator it, it2;
326 
327  for (it = _delim.begin(); it != _delim.end(); )
328  {
329  if (*it == delim)
330  {
331  it2 = it++;
332  _delim.erase(it2);
333  }
334  else
335  it++;
336  }
337  }
std::list< std::string > _delim
Definition: socket.hh:200
void Network::Socket::enable_tls ( )

Enable TLS on socket.

Definition at line 69 of file socket.cc.

References _kind, _socket, connected(), HERE, and Network::TCP.

Referenced by Network::TcpSocket::accept().

70  {
71 #ifdef TLS
72  int ret;
73 
74  if (_kind != TCP)
75  throw TLSError("You need to have a TCP connection", HERE);
76  if (!connected())
77  throw NoConnection("You need to have a connection", HERE);
78 
79  gnutls_transport_set_ptr(_session, (gnutls_transport_ptr)_socket);
80  ret = gnutls_handshake(_session);
81  if (ret < 0)
82  {
83  close(_socket);
84  gnutls_deinit(_session);
85  throw TLSError(gnutls_strerror(ret), HERE);
86  }
87 #else
88  throw TLSSupportError("lib was not compiled with TLS support", HERE);
89 #endif
90  }
bool connected() const
return true when socket is connected
Definition: socket.cc:303
SOCKET_KIND _kind
Definition: socket.hh:190
#define HERE
int Network::Socket::get_socket ( )

get socket (fd) warning: be very carefull with this method

Definition at line 313 of file socket.cc.

References _socket.

314  {
315  return _socket;
316  }
void Network::Socket::init_tls ( GnuTLSKind  kind,
unsigned  size = 1024,
const std::string &  certfile = "",
const std::string &  keyfile = "",
const std::string &  trustfile = "",
const std::string &  crlfile = "" 
)

Exceptions
TLSSupportErrorwhen TLS is not enabled

Definition at line 92 of file socket.cc.

References _tls, and HERE.

97  {
98 #ifdef TLS
99  static bool init = false;
100  static gnutls_dh_params dh_params;
101  const int protocol_tls[] = { GNUTLS_TLS1, 0 };
102  const int protocol_ssl[] = { GNUTLS_SSL3, 0 };
103  const int cert_type_priority[] = { GNUTLS_CRT_X509,
104  GNUTLS_CRT_OPENPGP, 0 };
105 
106  if (!init)
107  {
108  gnutls_global_init();
109  init = true;
110  }
111  _tls = true;
112  _tls_main = true;
113  gnutls_certificate_allocate_credentials(&_x509_cred);
114  if (keyfile.size() > 0 && certfile.size() > 0)
115  {
116  std::ifstream key(keyfile.c_str()), cert(certfile.c_str());
117  if (!key.is_open() || !cert.is_open())
118  throw InvalidFile("key or cert invalid", HERE);
119  key.close();
120  cert.close();
121  // Only for server...
122  _nbbits = size;
123  if (trustfile.size() > 0)
124  gnutls_certificate_set_x509_trust_file(_x509_cred, trustfile.c_str(),
125  GNUTLS_X509_FMT_PEM);
126  if (crlfile.size() > 0)
127  gnutls_certificate_set_x509_crl_file(_x509_cred, crlfile.c_str(),
128  GNUTLS_X509_FMT_PEM);
129  gnutls_certificate_set_x509_key_file(_x509_cred, certfile.c_str(),
130  keyfile.c_str(),
131  GNUTLS_X509_FMT_PEM);
132  gnutls_dh_params_init(&dh_params);
133  gnutls_dh_params_generate2(dh_params, _nbbits);
134  gnutls_certificate_set_dh_params(_x509_cred, dh_params);
135 
136  if (gnutls_init(&_session, GNUTLS_SERVER))
137  throw TLSError("gnutls_init failed", HERE);
138  }
139  else
140  {
141  if (gnutls_init(&_session, GNUTLS_CLIENT))
142  throw TLSError("gnutls_init failed", HERE);
143  }
144 
145  gnutls_set_default_priority(_session);
146  if (kind == TLS)
147  gnutls_protocol_set_priority(_session, protocol_tls);
148  else
149  gnutls_protocol_set_priority(_session, protocol_ssl);
150 
151  if (keyfile.size() > 0 && certfile.size() > 0)
152  {
153  gnutls_credentials_set(_session, GNUTLS_CRD_CERTIFICATE, _x509_cred);
154  gnutls_certificate_server_set_request(_session, GNUTLS_CERT_REQUEST);
155  gnutls_dh_set_prime_bits(_session, _nbbits);
156  }
157  else
158  {
159  gnutls_certificate_type_set_priority(_session, cert_type_priority);
160  gnutls_credentials_set(_session, GNUTLS_CRD_CERTIFICATE, _x509_cred);
161  }
162 #else
163  throw TLSSupportError("lib was not compiled with TLS support", HERE);
164 #endif
165  }
#define HERE
virtual std::string Network::Socket::read ( )
pure virtual

function used by >> operator (read a string on current socket)

Implemented in Network::LocalSocket, and Network::NetSocket.

Referenced by Network::operator>>().

virtual std::string Network::Socket::read ( int  timeout)
pure virtual

read a string with a timeout

Implemented in Network::LocalSocket, and Network::NetSocket.

virtual std::string Network::Socket::readn ( unsigned int  size)
pure virtual

read a string from socket

Parameters
sizerepresente the number of byte to read

Implemented in Network::LocalSocket, and Network::NetSocket.

virtual std::string Network::Socket::readn ( int  timeout,
unsigned int  size 
)
pure virtual

read a string with a timeout

Parameters
sizerepresente the number of byte to read

Implemented in Network::LocalSocket, and Network::NetSocket.

void Network::Socket::write ( const std::string &  str)

function used by << operator (write a string on current socket)

Definition at line 295 of file socket.cc.

References _proto_kind, _socket, _write_str(), _write_str_bin(), and Network::binary.

Referenced by Network::operator<<().

296  {
297  if (_proto_kind == binary)
298  _write_str_bin(_socket, str);
299  else
300  _write_str(_socket, str);
301  }
void _write_str_bin(int socket, const std::string &str) const
Write a string to a socket (when used with binary protocol) when there is no open socket when there i...
Definition: socket.cc:230
PROTO_KIND _proto_kind
Definition: socket.hh:199
void _write_str(int socket, const std::string &str) const
Write a string to a socket (when used with textual protocol) when there is no open socket when there ...
Definition: socket.cc:198

Member Data Documentation

struct sockaddr_in Network::Socket::_addr
protected
std::list<std::string> Network::Socket::_delim
protected

Definition at line 200 of file socket.hh.

Referenced by _find_delim(), add_delim(), del_delim(), and Socket().

bool Network::Socket::_empty_lines
protected

Definition at line 201 of file socket.hh.

Referenced by _update_buffer(), and allow_empty_lines().

SOCKET_KIND Network::Socket::_kind
protected
int Network::Socket::_recv_flags
protected

Definition at line 194 of file socket.hh.

unsigned Network::Socket::_state_timeout
protected

The documentation for this class was generated from the following files: