|
libsocket 1.5
|
This class represent a tcp connection (client and server) More...
#include <tcpsocket.hh>
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) | |||||||
| TcpSocket * | accept () 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)
| |||||||
| std::string | _read_line_bin (int socket, unsigned int psize) | ||||||
Get a line from socket (when used with binary protocol)
| |||||||
This class represent a tcp connection (client and server)
Definition at line 32 of file tcpsocket.hh.
| Network::TcpSocket::TcpSocket | ( | SOCKET_VERSION | version = V4 | ) | [inline] |
| Network::TcpSocket::TcpSocket | ( | PROTO_KIND | pkind, |
| SOCKET_VERSION | version = V4 |
||
| ) | [inline] |
Definition at line 38 of file tcpsocket.hh.
| Network::TcpSocket::TcpSocket | ( | int | socket, |
| SOCKET_VERSION | version = V4 |
||
| ) | [inline] |
Definition at line 41 of file tcpsocket.hh.
References Network::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.
| virtual Network::TcpSocket::~TcpSocket | ( | ) | [inline, virtual] |
| 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)
| 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.
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)
| 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.
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().
| 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.
| 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.
| 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.