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="")
 
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. More...
 
void _listen (int socket) const
 Listen on port. More...
 
virtual std::string _read_line (int socket)=0
 Get a line from socket (when used with textual protocol) More...
 
virtual std::string _read_line_bin (int socket, unsigned int size)=0
 Get a line from socket (when used with binary protocol) More...
 
void _write_str (int socket, const std::string &str) const
 Write a string to a socket (when used with textual protocol) More...
 
void _write_str_bin (int socket, const std::string &str) const
 Write a string to a socket (when used with binary protocol) 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

◆ Socket() [1/2]

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

Definition at line 31 of file socket.cc.

31 :
32 _kind(kind), _version(version), _state_timeout(0),
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 }
bool _empty_lines
Definition: socket.hh:201
std::string _buffer
Definition: socket.hh:202
unsigned _state_timeout
Definition: socket.hh:192
SOCKET_KIND _kind
Definition: socket.hh:190
SOCKET_VERSION _version
Definition: socket.hh:191
std::list< std::string > _delim
Definition: socket.hh:200
PROTO_KIND _proto_kind
Definition: socket.hh:199
@ V6
Definition: socket.hh:88
@ text
Definition: socket.hh:74
#define HERE

References _delim, HERE, and Network::V6.

◆ Socket() [2/2]

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

Definition at line 48 of file socket.cc.

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 }

References _delim, HERE, and Network::V6.

◆ ~Socket()

Network::Socket::~Socket ( )
virtual

Definition at line 65 of file socket.cc.

66 {
67 }

Member Function Documentation

◆ _check_answer()

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.

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 = "";
39 return true;
40 }
41 }
42 return false;
43 }

References _buffer, _state_timeout, and HERE.

◆ _close()

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.

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 }

References _tls, and HERE.

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

◆ _find_delim()

std::pair< int, int > Network::Socket::_find_delim ( const std::string &  str,
int  start 
) const
protected

Definition at line 339 of file socket.cc.

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 }

References _delim.

Referenced by _update_buffer().

◆ _listen()

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.

193 {
194 if (socket < 0 || listen(socket, 5) < 0)
195 throw ListenError("Listen Error", HERE);
196 }

References HERE.

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

◆ _read_line()

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.

◆ _read_line_bin()

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::TcpSocket, Network::LocalSocket, Network::UdpSocket, and Network::NetSocket.

◆ _set_timeout()

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.

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 }

References HERE.

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

◆ _update_buffer()

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.

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::pair< int, int > _find_delim(const std::string &str, int start) const
Definition: socket.cc:339

References _buffer, _empty_lines, and _find_delim().

◆ _write_str()

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.

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
@ V4
Definition: socket.hh:87
#define SENDTO_FLAGS
Definition: socket.hh:48

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

Referenced by write().

◆ _write_str_bin()

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.

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,
256 (const struct sockaddr*)&_addr, sizeof(_addr));
257#ifdef IPV6_ENABLED
258 else
259 res = sendto(socket, buf + count, str.size() + 2 - count,
260 \ SENDTO_FLAGS,
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 }

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

Referenced by write().

◆ add_delim()

void Network::Socket::add_delim ( const std::string &  delim)

set the delimitor for the text mode

Definition at line 318 of file socket.cc.

319 {
320 _delim.push_back(delim);
321 }

References _delim.

◆ allow_empty_lines()

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.

309 {
310 _empty_lines = true;
311 }

References _empty_lines.

◆ connected()

bool Network::Socket::connected ( ) const

return true when socket is connected

Definition at line 303 of file socket.cc.

304 {
305 return _socket != 0;
306 }

References _socket.

Referenced by enable_tls().

◆ del_delim()

void Network::Socket::del_delim ( const std::string &  delim)

delete this delimitor for the socket

Definition at line 323 of file socket.cc.

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 }

References _delim.

◆ enable_tls()

void Network::Socket::enable_tls ( )

Enable TLS on socket.

Definition at line 69 of file socket.cc.

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
@ TCP
Definition: socket.hh:80

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

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

◆ get_socket()

int Network::Socket::get_socket ( )

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

Definition at line 313 of file socket.cc.

314 {
315 return _socket;
316 }

References _socket.

◆ init_tls()

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.

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 }

References _tls, and HERE.

◆ read() [1/2]

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>>().

◆ read() [2/2]

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

read a string with a timeout

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

◆ readn() [1/2]

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.

◆ readn() [2/2]

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.

◆ write()

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.

296 {
297 if (_proto_kind == binary)
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)
Definition: socket.cc:230
void _write_str(int socket, const std::string &str) const
Write a string to a socket (when used with textual protocol)
Definition: socket.cc:198
@ binary
Definition: socket.hh:75

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

Referenced by Network::operator<<().

Member Data Documentation

◆ _addr

struct sockaddr_in Network::Socket::_addr
protected

◆ _buffer

◆ _delim

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().

◆ _empty_lines

bool Network::Socket::_empty_lines
protected

Definition at line 201 of file socket.hh.

Referenced by _update_buffer(), and allow_empty_lines().

◆ _kind

SOCKET_KIND Network::Socket::_kind
protected

Definition at line 190 of file socket.hh.

Referenced by Network::NetSocket::_bind(), and enable_tls().

◆ _proto_kind

◆ _recv_flags

int Network::Socket::_recv_flags
protected

Definition at line 194 of file socket.hh.

◆ _socket

◆ _state_timeout

unsigned Network::Socket::_state_timeout
protected

Definition at line 192 of file socket.hh.

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

◆ _tls

◆ _version


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