|
libsocket 1.5
|
This class represent a udp connection (client and server) More...
#include <udpsocket.hh>
Public Member Functions | |||||||
| UdpSocket (SOCKET_VERSION version=V4) | |||||||
| UdpSocket (PROTO_KIND pkind, SOCKET_VERSION version=V4) | |||||||
| virtual | ~UdpSocket () | ||||||
| void | connect (const std::string &hostname, int port) | ||||||
| Connect as an UDP client. | |||||||
| void | connect (int port) | ||||||
| Connect as an UDP server. | |||||||
| void | close () | ||||||
| Close the connection. | |||||||
Protected Member Functions | |||||||
| std::string | _read_line_bin (int socket, int &port, std::string &host, unsigned int pkg_size) | ||||||
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 size) | ||||||
Get a line from socket (when used with binary protocol)
| |||||||
This class represent a udp connection (client and server)
Definition at line 32 of file udpsocket.hh.
| Network::UdpSocket::UdpSocket | ( | SOCKET_VERSION | version = V4 | ) | [inline] |
Definition at line 35 of file udpsocket.hh.
| Network::UdpSocket::UdpSocket | ( | PROTO_KIND | pkind, |
| SOCKET_VERSION | version = V4 |
||
| ) | [inline] |
Definition at line 38 of file udpsocket.hh.
| virtual Network::UdpSocket::~UdpSocket | ( | ) | [inline, virtual] |
| std::string Network::UdpSocket::_read_line_bin | ( | int | socket, |
| int & | port, | ||
| std::string & | host, | ||
| unsigned int | pkg_size | ||
| ) | [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 101 of file udpsocket.cc.
References Network::Socket::_buffer, Network::Socket::_version, HERE, 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;
#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 && !pkg_size)
{
pkg_size = (unsigned char)_buffer[0] * 256 + (unsigned char)_buffer[1];
_buffer = _buffer.substr(2, _buffer.size() - 2);
}
if (pkg_size && _buffer.size() >= pkg_size)
{
str = _buffer.substr(0, pkg_size);
_buffer = _buffer.substr(pkg_size, _buffer.size() - pkg_size);
}
else
while (!end)
{
#ifdef LIBSOCKET_WIN
int flags = 0;
#else
int flags = MSG_TRUNC;
#endif
#ifdef IPV6_ENABLED
if (V4 == _version)
#endif
res = recvfrom(socket, chr, MAXPKTSIZE, flags,
(struct sockaddr *) &addr, &size);
#ifdef IPV6_ENABLED
else
res = recvfrom(socket, chr, MAXPKTSIZE, flags,
(struct sockaddr *) &addr6, &size);
#endif
if (res <= 0)
throw ConnectionClosed("Connection Closed", HERE);
// _buffer += all octets received
_buffer += std::string(chr, res).substr(0, res);
if (!pkg_size)
{
// extract size from _buffer and reduce it
pkg_size = (unsigned char)_buffer[0] * 256 +
(unsigned char)_buffer[1];
_buffer = _buffer.substr(2, _buffer.size() - 2);
}
if (_buffer.size() > pkg_size - str.size())
{
str += _buffer.substr(0, pkg_size - str.size());
_buffer = _buffer.substr(pkg_size - str.size(),
_buffer.size() - pkg_size - str.size());
}
else
{
str += _buffer;
_buffer = "";
}
if (str.size() >= 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::UdpSocket::_read_line_bin | ( | int | socket, |
| unsigned int | size | ||
| ) | [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 46 of file udpsocket.cc.
References Network::Socket::_buffer, and HERE.
{
char chr[MAXPKTSIZE];
std::string str = "";
int res = 1;
bool end = false;
if (socket < 0)
throw NoConnection("No Socket", HERE);
if (_buffer.size() >= 2 && !size)
{
size = (unsigned char)_buffer[0] * 256 + (unsigned char)_buffer[1];
_buffer = _buffer.substr(2, _buffer.size() - 2);
}
if (size && _buffer.size() >= size)
{
str = _buffer.substr(0, size);
_buffer = _buffer.substr(size, _buffer.size() - size);
}
else
while (!end)
{
memset(chr, 0, MAXPKTSIZE);
#ifdef LIBSOCKET_WIN
res = recv(socket, chr, MAXPKTSIZE, 0);
#else
res = recv(socket, chr, MAXPKTSIZE, MSG_TRUNC);
#endif
if (res <= 0)
throw ConnectionClosed("Connection Closed", HERE);
// _buffer += all octets received
_buffer += std::string(chr, res);
if (!size)
{
// extract size from _buffer and reduce it
size = (unsigned char)_buffer[0] * 256 + (unsigned char)_buffer[1];
_buffer = _buffer.substr(2, _buffer.size() - 2);
}
if (_buffer.size() > size - str.size())
{
str += _buffer.substr(0, size - str.size());
_buffer = _buffer.substr(size - str.size(),
_buffer.size() - size - str.size());
}
else
{
str += _buffer;
_buffer = "";
}
if (str.size() >= size)
end = true;
}
return str;
}
| void Network::UdpSocket::close | ( | ) |
Close the connection.
Definition at line 39 of file udpsocket.cc.
References Network::Socket::_close(), and Network::Socket::_socket.
Referenced by ~UdpSocket().
| void Network::UdpSocket::connect | ( | const std::string & | hostname, |
| int | port | ||
| ) |
Connect as an UDP client.
Here is an example of an UDP client using libsocket:
#include <stdlib.h> #include <iostream> #include <string> #include "socket/udpsocket.hh"
int main(int argc, char **argv)
{
Network::UdpSocket client;
//Network::UdpSocket client(Network::V6);
// For IPV6 mode
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));
while (str != "quit")
{
std::cin >> str;
client << str;
}
client.close();
exit(0);
}
catch (Network::Exception e)
{
std::cerr << e;
exit(1);
}
}
Definition at line 27 of file udpsocket.cc.
References Network::NetSocket::_bind(), Network::NetSocket::_port, and Network::Socket::_socket.
| void Network::UdpSocket::connect | ( | int | port | ) |
Connect as an UDP server.
Here is an example of an UDP server using libsocket :
#include <stdlib.h> #include <iostream> #include <string> #include "socket/udpsocket.hh" #include "exception/exception.hh"
int main(int argc, char **argv)
{
Network::UdpSocket server;
std::string str, host; if (argc < 2)
{
std::cout << "Use: " << argv[0] << " port" << std::endl;
exit(0);
}
try
{
server.connect(strtol(argv[1], NULL, 10));
while (str != "quit")
{
//read with a timeout of 30 seconds and get client host and port
str = server.read(port, host, 30);
std::cout << "Received [" << str << "] from : " << host
<< ":" << port << "]" << std::endl;
}
server.close();
exit (0);
}
catch (Network::Timeout e)
{
std::cerr << e;
std::cerr << "No connection during last 30s, closing connection"
<< std::endl;
exit (1);
}
catch (Network::Exception e)
{
std::cerr << e;
exit(1);
}
}
Definition at line 33 of file udpsocket.cc.
References Network::NetSocket::_bind(), Network::NetSocket::_port, and Network::Socket::_socket.