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.