libsocket 1.5
Network::TcpSocket Class Reference

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

#include <tcpsocket.hh>

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

List of all members.

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.
std::string get_ip (TcpSocket *client) const
 return ip of client (after an accept)
TcpSocketaccept () const
 accept a new client (For server only)
void connect (int port)
 Connect as an TCP server (echo server)
void close ()
 Close the connection.

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)

Exceptions:
NoConnectionwhen there is no open socket
ConnectionClosedwhen there is no more connection
GetpeernameErrorwhen getpeername libc function return a negative value.

std::string _read_line_bin (int socket, unsigned int psize)
 Get a line from socket (when used with binary protocol)

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


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

Network::TcpSocket::TcpSocket ( SOCKET_VERSION  version = V4) [inline]

Definition at line 35 of file tcpsocket.hh.

Referenced by accept().

                                           :
      NetSocket(TCP, version)
    {}
Network::TcpSocket::TcpSocket ( PROTO_KIND  pkind,
SOCKET_VERSION  version = V4 
) [inline]

Definition at line 38 of file tcpsocket.hh.

                                                             :
      NetSocket(TCP, pkind, version)
    {}
Network::TcpSocket::TcpSocket ( int  socket,
SOCKET_VERSION  version = V4 
) [inline]

Definition at line 41 of file tcpsocket.hh.

References Network::Socket::_socket.

                                                       :
      NetSocket(TCP, version)
    {
      _socket = socket;
    }
Network::TcpSocket::TcpSocket ( int  socket,
PROTO_KIND  pkind,
SOCKET_VERSION  version = V4 
) [inline]

Definition at line 46 of file tcpsocket.hh.

References Network::Socket::_socket.

                                                                         :
      NetSocket(TCP, pkind, version)
    {
      _socket = socket;
    }
virtual Network::TcpSocket::~TcpSocket ( ) [inline, virtual]

Definition at line 52 of file tcpsocket.hh.

References close().

    {
      close();
    }

Member Function Documentation

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:
NoConnectionwhen there is no open socket
ConnectionClosedwhen there is no more connection
GetpeernameErrorwhen getpeername libc function return a negative value.

Implements Network::NetSocket.

Definition at line 152 of file tcpsocket.cc.

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

  {
    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;
  }
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:
NoConnectionwhen there is no open socket
ConnectionClosedwhen there is no more connection.

Implements Network::NetSocket.

Definition at line 81 of file tcpsocket.cc.

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

  {
    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;
  }
TcpSocket * Network::TcpSocket::accept ( ) const

accept a new client (For server only)

Definition at line 42 of file tcpsocket.cc.

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.

  {
    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;
  }
void Network::TcpSocket::close ( )

Close the connection.

Definition at line 74 of file tcpsocket.cc.

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

Referenced by ~TcpSocket().

  {
    if (_socket > 0)
      _close(_socket);
    _socket = 0;
  }
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.

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

  {
    _port = port;
    _socket = _bind(port);
    _listen(_socket);
  }
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.

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

  {
    _port = port;
    _socket = _bind(port, hostname);
    _connect(_socket, port, hostname);
  }
std::string Network::TcpSocket::get_ip ( TcpSocket client) const

return ip of client (after an accept)

Definition at line 69 of file tcpsocket.cc.

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

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

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