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.