Network::TcpSocket Class Reference

This class represent a tcp connection (client and server) More...

`#include <tcpsocket.hh>`

Inheritance diagram for Network::TcpSocket:

## Public Member Functions

| TcpSocket (SOCKET_VERSION version=V4)
| TcpSocket (PROTO_KIND pkind, SOCKET_VERSION version=V4)
| TcpSocket (int socket, SOCKET_VERSION version=V4)
| TcpSocket (int socket, PROTO_KIND pkind, SOCKET_VERSION version=V4)
virtual | ~TcpSocket ()
void | connect (const std::string &hostname, int port)
| Connect as an TCP client. More...
std::string | get_ip (TcpSocket *client) const
| return ip of client (after an accept) More...
TcpSocket * | accept () const
| accept a new client (For server only) More...
void | connect (int port)
| Connect as an TCP server (echo server) More...
void | close ()
| Close the connection. More...
Public Member Functions inherited from Network::NetSocket
| NetSocket (SOCKET_KIND kind, SOCKET_VERSION version=V4)
| NetSocket (SOCKET_KIND kind, PROTO_KIND pkind, SOCKET_VERSION version=V4)
virtual | ~NetSocket ()
virtual void | writeto (const std::string &str, const std::string &host, int port)
| function used to send a msg to a specific host (UDP) More...
std::string | read ()
| function used by >> operator (read a string on current socket) More...
std::string | read (int timeout)
| read a string with a timeout More...
std::string | read (int &port, std::string &host)
| Get a line from socket and store client hostname and port in port and host variable. More...
std::string | read (int &port, std::string &host, int timeout)
| Get a line from socket and store client hostname and port in port and host variable (with a timeout on listen) More...
std::string | readn (unsigned int size)
| read a string from socket More...
std::string | readn (int timeout, unsigned int size)
| read a string with a timeout More...
std::string | readn (int &port, std::string &host, unsigned int size)
| Get a line from socket and store client hostname and port in port and host variable. More...
std::string | readn (int &port, std::string &host, int timeout, unsigned int size)
| Get a line from socket and store client hostname and port in port and host variable (with a timeout on listen) More...
Public Member Functions inherited from Network::Socket
| 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...

## Protected Member Functions

std::string | _read_line_bin (int socket, int &port, std::string &host, unsigned int psize)
| Get a line from socket and store client hostname and port in port and host variable (when used with binary protocol) More...
std::string | _read_line_bin (int socket, unsigned int psize)
| Get a line from socket (when used with binary protocol) More...
Protected Member Functions inherited from Network::NetSocket
struct sockaddr_in | _get_addr (int port) const
| internal function (construct a sockaddr) More...
struct sockaddr_in | _get_addr (const std::string &host, int port) const
| internal function (construct a sockaddr) More...
int | _bind (int port, const std::string &host)
| Bind a UDP server. More...
int | _bind (int port)
| Bind a TCP server. More...
int | _accept (int port, int server_socket) const
| Wait for a client. More...
std::string | _get_ip (int port, int socket) const
| Get Client Ip. More...
void | _connect (int socket, int port, const std::string &host) const
| Connect to a hostname. More...
std::string | _read_line (int socket)
| Get a line from socket (when used with textual protocol) More...
std::string | _read_line (int socket, int &port, std::string &host)
| Get a line from socket and store client hostname and port in port and host variable (when used with textual protocol) More...
void | _write_str (int socket, const std::string &str, const std::string &host, int port) const
| Write a string to a socket to a particular host (UDP) (when used with textual protocol) More...
void | _write_str_bin (int socket, const std::string &str, const std::string &host, int port) const
| Write a string to a socket to a particular host (UDP) (when used with binary protocol) More...
Protected Member Functions inherited from Network::Socket
void | _close (int socket) const
| Close a connnection. More...
void | _listen (int socket) const
| Listen on port. 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...

## Additional Inherited Members

Protected Attributes inherited from Network::NetSocket
int | _port
Protected Attributes inherited from Network::Socket
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 a tcp connection (client and server)

Author
  Julien Lemoine <speedblue at happycoders dot org>

Definition at line 32 of file tcpsocket.hh.

## Constructor & Destructor Documentation

## TcpSocket() [1/4]

Network::TcpSocket::TcpSocket | ( | SOCKET_VERSION | version = `V4` | ) |

inline

Definition at line 35 of file tcpsocket.hh.

:
NetSocket(TCP, version)
{}

Referenced by accept().

## TcpSocket() [2/4]

Network::TcpSocket::TcpSocket | ( | PROTO_KIND | pkind,
|  | SOCKET_VERSION | version = `V4`
| ) |  |

inline

Definition at line 38 of file tcpsocket.hh.

:
NetSocket(TCP, pkind, version)
{}

## TcpSocket() [3/4]

Network::TcpSocket::TcpSocket | ( | int | socket,
|  | SOCKET_VERSION | version = `V4`
| ) |  |

inline

Definition at line 41 of file tcpsocket.hh.

:
NetSocket(TCP, version)
{
_socket = socket;
}

References Network::Socket::_socket.

## TcpSocket() [4/4]

Network::TcpSocket::TcpSocket | ( | int | socket,
|  | PROTO_KIND | pkind,
|  | SOCKET_VERSION | version = `V4`
| ) |  |

inline

Definition at line 46 of file tcpsocket.hh.

:
NetSocket(TCP, pkind, version)
{
_socket = socket;
}

References Network::Socket::_socket.

## ~TcpSocket()

virtual Network::TcpSocket::~TcpSocket | ( |  | ) |

inline virtual

Definition at line 52 of file tcpsocket.hh.

{
close();
}

References close().

## Member Function Documentation

## _read_line_bin() [1/2]

std::string Network::TcpSocket::_read_line_bin | ( | int | socket,
|  | int & | port,
|  | std::string & | host,
|  | unsigned int | psize
| ) |  |

protected virtual

Get a line from socket and store client hostname and port in port and host variable (when used with binary protocol)

Exceptions

  NoConnection | when there is no open socket
  ConnectionClosed | when there is no more connection
  GetpeernameError | when getpeername libc function return a negative value

Implements Network::NetSocket.

Definition at line 152 of file tcpsocket.cc.

{
char chr[MAXPKTSIZE];
std::string str = "";
int res = 1;
struct sockaddr_in addr;
#ifdef IPV6_ENABLED
struct sockaddr_in6 addr6;
#endif
#ifdef LIBSOCKET_WIN
int size;
#else
socklen_t size;
#endif
bool end = false;
unsigned int pkg_size = 0, read = 0;
#ifdef IPV6_ENABLED
if (V4 == _version)
#endif
size = sizeof(addr);
#ifdef IPV6_ENABLED
else
size = sizeof(addr6);
#endif
if (socket < 0)
throw NoConnection("No Socket", HERE);
if (_buffer.size() >= 2 && !psize)
{
pkg_size = (unsigned char)_buffer[0] * 256 + (unsigned char)_buffer[1];
str = _buffer.substr(2, pkg_size);
if (_buffer.size() > pkg_size + 2)
_buffer = _buffer.substr(pkg_size + 2, _buffer.size() - pkg_size - 2);
else
_buffer = "";
read = str.size();
}
if (psize && _buffer.size() >= psize)
{
str = _buffer.substr(0, psize);
_buffer = _buffer.substr(psize, _buffer.size() - psize);
return str;
}
else if (!psize)
{
// _buffer.size() is 0 or 1
#ifdef TLS
if (_tls)
res = gnutls_record_recv(_session, chr, 2 - _buffer.size());
else
#endif
res = recv(socket, chr, 2 - _buffer.size(), 0);
if (res <= 1)
throw ConnectionClosed("Connection Closed", HERE);
if (_buffer.size())
pkg_size = (unsigned char)_buffer[0] * 256 + (unsigned char)chr[0];
else
pkg_size = (unsigned char)chr[0] * 256 + (unsigned char)chr[1];
_buffer = "";
}
else
{
// _buffer contains less characters than size, so copy
// _bufer in str and clear _buffer.
str = _buffer;
_buffer = "";
pkg_size = psize;
read = str.size();
}
while (!end)
{
#ifdef TLS
if (_tls)
res = gnutls_record_recv(_session, chr, size - read);
else
#endif
res = recv(socket, chr, size - read, 0);
#ifdef IPV6_ENABLED
if (V4 == _version)
#endif
if (getpeername(socket, (struct sockaddr *) &addr, &size) < 0)
throw GetpeernameError("getpeername error", HERE);
#ifdef IPV6_ENABLED
else
if (getpeername(socket, (struct sockaddr *) &addr6, &size) < 0)
throw GetpeernameError("getpeername error", HERE);
#endif
if (res <= 0)
throw ConnectionClosed("Connection Closed", HERE);
str += std::string(chr, res).substr(0, res);
read += res;
if (read >= pkg_size)
end = true;
}
#ifdef IPV6_ENABLED
if (V4 == _version)
{
#endif
host = std::string(inet_ntoa(addr.sin_addr));
port = ntohs(addr.sin_port);
#ifdef IPV6_ENABLED
}
else
{
char buf[INET6_ADDRSTRLEN];
if (inet_ntop(AF_INET6, &addr6.sin6_addr, buf, INET6_ADDRSTRLEN) == 0)
throw InetntopError("Not a valid address", HERE);
host = std::string(buf);
port = ntohs(addr6.sin6_port);
}
#endif
return str;
}

References Network::Socket::_buffer, Network::Socket::_tls, Network::Socket::_version, HERE, Network::NetSocket::read(), and Network::V4.

## _read_line_bin() [2/2]

std::string Network::TcpSocket::_read_line_bin | ( | int | socket,
|  | unsigned int | psize
| ) |  |

protected virtual

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

Exceptions

  NoConnection | when there is no open socket
  ConnectionClosed | when there is no more connection

Implements Network::NetSocket.

Definition at line 81 of file tcpsocket.cc.

{
char chr[MAXPKTSIZE];
std::string str = "";
int res = 1;
unsigned int size = 0, read = 0;
bool end = false;
if (socket < 0)
throw NoConnection("No Socket", HERE);
if (_buffer.size() >= 2 && !psize)
{
size = (unsigned char)_buffer[0] * 256 + (unsigned char)_buffer[1];
str = _buffer.substr(2, size);
if (_buffer.size() > size + 2)
_buffer = _buffer.substr(size + 2, _buffer.size() - size - 2);
else
_buffer = "";
read = str.size();
}
if (psize && _buffer.size() >= psize)
{
str = _buffer.substr(0, psize);
_buffer = _buffer.substr(psize, _buffer.size() - psize);
return str;
}
else if (!psize)
{
// _buffer.size() is 0 or 1
#ifdef TLS
if (_tls)
res = gnutls_record_recv(_session, chr, 2 - _buffer.size());
else
#endif
res = recv(socket, chr, 2 - _buffer.size(), 0);
if (res <= 1)
throw ConnectionClosed("Connection Closed", HERE);
if (_buffer.size())
size = (unsigned char)_buffer[0] * 256 + (unsigned char)chr[0];
else
size = (unsigned char)chr[0] * 256 + (unsigned char)chr[1];
_buffer = "";
}
else
{
// _buffer contains less characters than size, so copy
// _bufer in str and clear _buffer.
str = _buffer;
_buffer = "";
size = psize;
read = str.size();
}
while (!end)
{
memset(chr, 0, MAXPKTSIZE);
#ifdef TLS
if (_tls)
res = gnutls_record_recv(_session, chr, size - read);
else
#endif
res = recv(socket, chr, size - read, 0);
if (res <= 0)
throw ConnectionClosed("Connection Closed", HERE);
str += std::string(chr, res).substr(0, res);
read += res;
if (read >= size)
end = true;
}
return str;
}

References Network::Socket::_buffer, Network::Socket::_tls, HERE, and Network::NetSocket::read().

## accept()

TcpSocket * Network::TcpSocket::accept | ( |  | ) | const

accept a new client (For server only)

Definition at line 42 of file tcpsocket.cc.

{
TcpSocket* res;
#ifdef IPV6_ENABLED
if (V4 == _version)
#endif
res = new TcpSocket(_accept(_port, _socket));
#ifdef IPV6_ENABLED
else
res = new TcpSocket(_accept(_port, _socket), V6);
#endif
res->_port = _port;
res->_proto_kind = _proto_kind;
#ifdef TLS
if (_tls)
{
res->_tls = true;
res->_tls_main = false;
res->_session = _session;
res->_x509_cred = _x509_cred;
res->enable_tls();
}
#endif
return res;
}

References Network::NetSocket::_accept(), Network::NetSocket::_port, Network::Socket::_proto_kind, Network::Socket::_socket, Network::Socket::_tls, Network::Socket::_version, Network::Socket::enable_tls(), TcpSocket(), Network::V4, and Network::V6.

## close()

void Network::TcpSocket::close | ( |  | ) |

Close the connection.

Definition at line 74 of file tcpsocket.cc.

{
if (_socket > 0)
_close(_socket);
_socket = 0;
}

References Network::Socket::_close(), and Network::Socket::_socket.

Referenced by ~TcpSocket().

## connect() [1/2]

void Network::TcpSocket::connect | ( | const std::string & | hostname,
|  | int | port
| ) |  |

Connect as an TCP client.

Here is an example of tcp client using libsocket :

    #include <stdlib.h>
    #include <iostream>
    #include <string>
    #include "socket/tcpsocket.hh"

    int main(int argc, char **argv)
    {
      Network::TcpSocket            client;
      std::string                   str;

      if (argc < 3)
        {
          std::cout << "Use: " << argv[0] << " port hostname" << std::endl;
          exit(0);
        }
      try
        {
          client.connect(std::string(argv[2]), strtol(argv[1], NULL, 10));
          client >> str;
          std::cout << str << std::endl;

          while (str != "quit")
            {
              std::cin >> str;
              client << str;
              client >> str;
            }
          client.close();
          exit (0);
        }
      catch (Network::Exception e) // catch all libsocket errors
        {
          std::cerr << e;
          exit(1);
        }

    }

Definition at line 28 of file tcpsocket.cc.

{
_port = port;
_socket = _bind(port, hostname);
_connect(_socket, port, hostname);
}

References Network::NetSocket::_bind(), Network::NetSocket::_connect(), Network::NetSocket::_port, and Network::Socket::_socket.

## connect() [2/2]

void Network::TcpSocket::connect | ( | int | port | ) |

Connect as an TCP server (echo server)

Here is an example of tcp server using libsocket :

    #include <stdlib.h>
    #include <iostream>
    #include <string>
    #include "socket/tcpsocket.hh"

    int main(int argc, char **argv)
    {
      Network::TcpSocket            server;
      Network::TcpSocket            *client;
      std::string                   str;

      if (argc < 2)
        {
          std::cout << "Use: " << argv[0] << " port" << std::endl;
          exit(0);
        }
      try
        {
          std::cout << "--- echo server ---" << std::endl;
          server.connect(strtol(argv[1], NULL, 10));
          client = server.accept();
          (*client) << "Welcome on test server";
          while (str != "quit")
                   {

                     //(*client) >> str;
                     // read with a timeout of 30 second and get port and host
                     str = client->read(port, host, 30);
                     std::cout << "[" << str << "] from [" << host << ":"
                               << port << "]" << std::endl;
                     (*client) << str;
                   }
          server.close();
          exit (0);
        }
      catch (Network::Exception e) // catch all libsocket errors
        {
          std::cerr << e;
          exit(1);
        }
    }

Definition at line 35 of file tcpsocket.cc.

{
_port = port;
_socket = _bind(port);
_listen(_socket);
}

References Network::NetSocket::_bind(), Network::Socket::_listen(), Network::NetSocket::_port, and Network::Socket::_socket.

## get_ip()

std::string Network::TcpSocket::get_ip | ( | TcpSocket * | client | ) | const

return ip of client (after an accept)

Definition at line 69 of file tcpsocket.cc.

{
return _get_ip(_port, client->_socket);
}

References Network::NetSocket::_get_ip(), Network::NetSocket::_port, and Network::Socket::_socket.

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

- tcpsocket.hh
- tcpsocket.cc

Network::NetSocket::_accept
int _accept(int port, int server_socket) const
Wait for a client.
Definition: netsocket.cc:211
Network::Socket::_listen
void _listen(int socket) const
Listen on port.
Definition: socket.cc:192
Network::NetSocket::NetSocket
NetSocket(SOCKET_KIND kind, SOCKET_VERSION version=V4)
Definition: netsocket.hh:36
Network::Socket::_buffer
std::string _buffer
Definition: socket.hh:202
Network::NetSocket::read
std::string read()
function used by >> operator (read a string on current socket)
Definition: netsocket.cc:533
Network::Socket::_proto_kind
PROTO_KIND _proto_kind
Definition: socket.hh:199
Network::Socket::_tls
bool _tls
Definition: socket.hh:203
Network::V6
@ V6
Definition: socket.hh:88
Network::Socket::_version
SOCKET_VERSION _version
Definition: socket.hh:191
Network::NetSocket::_port
int _port
Definition: netsocket.hh:161
Network::V4
@ V4
Definition: socket.hh:87
HERE
#define HERE
Definition: socketexception.hh:26
Network::TcpSocket::TcpSocket
TcpSocket(SOCKET_VERSION version=V4)
Definition: tcpsocket.hh:35
Network::TcpSocket::close
void close()
Close the connection.
Definition: tcpsocket.cc:74
Network::NetSocket::_connect
void _connect(int socket, int port, const std::string &host) const
Connect to a hostname.
Definition: netsocket.cc:186
Network::Socket::_socket
int _socket
Definition: socket.hh:193
Network::NetSocket::_bind
int _bind(int port, const std::string &host)
Bind a UDP server.
Definition: netsocket.cc:86
Network::TCP
@ TCP
Definition: socket.hh:80
Network::NetSocket::_get_ip
std::string _get_ip(int port, int socket) const
Get Client Ip.
Definition: netsocket.cc:243
Network::Socket::_close
void _close(int socket) const
Close a connnection.
Definition: socket.cc:167