#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) |
| Here is an example of tcp client using libsocket :. | |
| std::string | get_ip (TcpSocket *client) const |
| return ip of client (after an accept) | |
| TcpSocket * | TcpSocket::accept () const |
| accept a new client (For server only) | |
| void | connect (int port) |
| Here is an example of tcp server using libsocket :. | |
| 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). | |
Definition at line 32 of file tcpsocket.hh.
|
|
Definition at line 35 of file tcpsocket.hh. References Network::TCP. 00035 : 00036 NetSocket(TCP, version) 00037 {} TcpSocket(PROTO_KIND pkind, SOCKET_VERSION version = V4) :
|
|
||||||||||||
|
Definition at line 38 of file tcpsocket.hh. References Network::TCP. 00038 : 00039 NetSocket(TCP, pkind, version) 00040 {} TcpSocket(int socket, SOCKET_VERSION version = V4) :
|
|
||||||||||||
|
Definition at line 41 of file tcpsocket.hh. References Network::TCP. 00041 : 00042 NetSocket(TCP, version) 00043 { 00044 _socket = socket; 00045 } TcpSocket(int socket, PROTO_KIND pkind, SOCKET_VERSION version = V4) :
|
|
||||||||||||||||
|
Definition at line 46 of file tcpsocket.hh. References Network::TCP.
|
|
|
Definition at line 52 of file tcpsocket.hh. References close(). 00053 {
00054 close();
00055 }
|
|
||||||||||||
|
Get a line from socket (when used with binary protocol).
Implements Network::NetSocket. Definition at line 81 of file tcpsocket.cc. References HERE. 00082 {
00083 char chr[MAXPKTSIZE];
00084 std::string str = "";
00085 int res = 1;
00086 unsigned int size = 0, read = 0;
00087 bool end = false;
00088
00089 if (socket < 0)
00090 throw NoConnection("No Socket", HERE);
00091 if (_buffer.size() >= 2 && !psize)
00092 {
00093 size = (unsigned char)_buffer[0] * 256 + (unsigned char)_buffer[1];
00094 str = _buffer.substr(2, size);
00095 if (_buffer.size() > size + 2)
00096 _buffer = _buffer.substr(size + 2, _buffer.size() - size - 2);
00097 else
00098 _buffer = "";
00099 read = str.size();
00100 }
00101 if (psize && _buffer.size() >= psize)
00102 {
00103 str = _buffer.substr(0, psize);
00104 _buffer = _buffer.substr(psize, _buffer.size() - psize);
00105 return str;
00106 }
00107 else if (!psize)
00108 {
00109 // _buffer.size() is 0 or 1
00110 #ifdef TLS
00111 if (_tls)
00112 res = gnutls_record_recv(_session, chr, 2 - _buffer.size());
00113 else
00114 #endif
00115 res = recv(socket, chr, 2 - _buffer.size(), 0);
00116 if (res <= 1)
00117 throw ConnectionClosed("Connection Closed", HERE);
00118 if (_buffer.size())
00119 size = (unsigned char)_buffer[0] * 256 + (unsigned char)chr[0];
00120 else
00121 size = (unsigned char)chr[0] * 256 + (unsigned char)chr[1];
00122 _buffer = "";
00123 }
00124 else
00125 {
00126 // _buffer contains less characters than size, so copy
00127 // _bufer in str and clear _buffer.
00128 str = _buffer;
00129 _buffer = "";
00130 size = psize;
00131 read = str.size();
00132 }
00133 while (!end)
00134 {
00135 memset(chr, 0, MAXPKTSIZE);
00136 #ifdef TLS
00137 if (_tls)
00138 res = gnutls_record_recv(_session, chr, size - read);
00139 else
00140 #endif
00141 res = recv(socket, chr, size - read, 0);
00142 if (res <= 0)
00143 throw ConnectionClosed("Connection Closed", HERE);
00144 str += std::string(chr, res).substr(0, res);
00145 read += res;
00146 if (read >= size)
00147 end = true;
00148 }
00149 return str;
00150 }
|
|
||||||||||||||||||||
|
Get a line from socket and store client hostname and port in port and host variable (when used with binary protocol).
Implements Network::NetSocket. Definition at line 152 of file tcpsocket.cc. References HERE, and Network::V4. 00155 {
00156 char chr[MAXPKTSIZE];
00157 std::string str = "";
00158 int res = 1;
00159 struct sockaddr_in addr;
00160 #ifdef IPV6_ENABLED
00161 struct sockaddr_in6 addr6;
00162 #endif
00163 #ifdef LIBSOCKET_WIN
00164 int size;
00165 #else
00166 socklen_t size;
00167 #endif
00168 bool end = false;
00169 unsigned int pkg_size = 0, read = 0;
00170
00171 #ifdef IPV6_ENABLED
00172 if (V4 == _version)
00173 #endif
00174 size = sizeof(addr);
00175 #ifdef IPV6_ENABLED
00176 else
00177 size = sizeof(addr6);
00178 #endif
00179 if (socket < 0)
00180 throw NoConnection("No Socket", HERE);
00181 if (_buffer.size() >= 2 && !psize)
00182 {
00183 pkg_size = (unsigned char)_buffer[0] * 256 + (unsigned char)_buffer[1];
00184 str = _buffer.substr(2, pkg_size);
00185 if (_buffer.size() > pkg_size + 2)
00186 _buffer = _buffer.substr(pkg_size + 2, _buffer.size() - pkg_size - 2);
00187 else
00188 _buffer = "";
00189 read = str.size();
00190 }
00191 if (psize && _buffer.size() >= psize)
00192 {
00193 str = _buffer.substr(0, psize);
00194 _buffer = _buffer.substr(psize, _buffer.size() - psize);
00195 return str;
00196 }
00197 else if (!psize)
00198 {
00199 // _buffer.size() is 0 or 1
00200 #ifdef TLS
00201 if (_tls)
00202 res = gnutls_record_recv(_session, chr, 2 - _buffer.size());
00203 else
00204 #endif
00205 res = recv(socket, chr, 2 - _buffer.size(), 0);
00206 if (res <= 1)
00207 throw ConnectionClosed("Connection Closed", HERE);
00208 if (_buffer.size())
00209 pkg_size = (unsigned char)_buffer[0] * 256 + (unsigned char)chr[0];
00210 else
00211 pkg_size = (unsigned char)chr[0] * 256 + (unsigned char)chr[1];
00212 _buffer = "";
00213 }
00214 else
00215 {
00216 // _buffer contains less characters than size, so copy
00217 // _bufer in str and clear _buffer.
00218 str = _buffer;
00219 _buffer = "";
00220 pkg_size = psize;
00221 read = str.size();
00222 }
00223 while (!end)
00224 {
00225 #ifdef TLS
00226 if (_tls)
00227 res = gnutls_record_recv(_session, chr, size - read);
00228 else
00229 #endif
00230 res = recv(socket, chr, size - read, 0);
00231 #ifdef IPV6_ENABLED
00232 if (V4 == _version)
00233 #endif
00234 if (getpeername(socket, (struct sockaddr *) &addr, &size) < 0)
00235 throw GetpeernameError("getpeername error", HERE);
00236 #ifdef IPV6_ENABLED
00237 else
00238 if (getpeername(socket, (struct sockaddr *) &addr6, &size) < 0)
00239 throw GetpeernameError("getpeername error", HERE);
00240 #endif
00241 if (res <= 0)
00242 throw ConnectionClosed("Connection Closed", HERE);
00243 str += std::string(chr, res).substr(0, res);
00244 read += res;
00245 if (read >= pkg_size)
00246 end = true;
00247 }
00248 #ifdef IPV6_ENABLED
00249 if (V4 == _version)
00250 {
00251 #endif
00252 host = std::string(inet_ntoa(addr.sin_addr));
00253 port = ntohs(addr.sin_port);
00254 #ifdef IPV6_ENABLED
00255 }
00256 else
00257 {
00258 char buf[INET6_ADDRSTRLEN];
00259 if (inet_ntop(AF_INET6, &addr6.sin6_addr, buf, INET6_ADDRSTRLEN) == 0)
00260 throw InetntopError("Not a valid address", HERE);
00261 host = std::string(buf);
00262 port = ntohs(addr6.sin6_port);
00263 }
00264 #endif
00265 return str;
00266 }
|
|
|
Close the connection.
Definition at line 74 of file tcpsocket.cc. References Network::Socket::_close(). Referenced by ~TcpSocket(). 00075 {
00076 if (_socket > 0)
00077 _close(_socket);
00078 _socket = 0;
00079 }
|
|
|
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(), and Network::Socket::_listen().
|
|
||||||||||||
|
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(), and Network::NetSocket::_connect(). 00029 {
00030 _port = port;
00031 _socket = _bind(port, hostname);
00032 _connect(_socket, port, hostname);
00033 }
|
|
|
return ip of client (after an accept)
Definition at line 69 of file tcpsocket.cc. References Network::NetSocket::_get_ip(). 00070 {
00071 return _get_ip(_port, client->_socket);
00072 }
|
|
|
accept a new client (For server only)
|
1.4.0