#include <udpsocket.hh>
Inheritance diagram for Network::UdpSocket:

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) |
| Here is an example of an UDP client using libsocket:. | |
| void | connect (int port) |
| Here is an example of an UDP 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 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). | |
Definition at line 32 of file udpsocket.hh.
|
|
Definition at line 35 of file udpsocket.hh. References Network::UDP. 00035 : 00036 NetSocket(UDP, version) 00037 {} UdpSocket(PROTO_KIND pkind, SOCKET_VERSION version = V4) :
|
|
||||||||||||
|
Definition at line 38 of file udpsocket.hh. References Network::UDP. 00038 : 00039 NetSocket(UDP, pkind, version) 00040 {}
|
|
|
Definition at line 42 of file udpsocket.hh. References close(). 00043 {
00044 close();
00045 }
|
|
||||||||||||
|
Get a line from socket (when used with binary protocol).
Implements Network::NetSocket. Definition at line 46 of file udpsocket.cc. References HERE. 00047 {
00048 char chr[MAXPKTSIZE];
00049 std::string str = "";
00050 int res = 1;
00051 bool end = false;
00052
00053 if (socket < 0)
00054 throw NoConnection("No Socket", HERE);
00055 if (_buffer.size() >= 2 && !size)
00056 {
00057 size = (unsigned char)_buffer[0] * 256 + (unsigned char)_buffer[1];
00058 _buffer = _buffer.substr(2, _buffer.size() - 2);
00059 }
00060 if (size && _buffer.size() >= size)
00061 {
00062 str = _buffer.substr(0, size);
00063 _buffer = _buffer.substr(size, _buffer.size() - size);
00064 }
00065 else
00066 while (!end)
00067 {
00068 memset(chr, 0, MAXPKTSIZE);
00069 #ifdef LIBSOCKET_WIN
00070 res = recv(socket, chr, MAXPKTSIZE, 0);
00071 #else
00072 res = recv(socket, chr, MAXPKTSIZE, MSG_TRUNC);
00073 #endif
00074 if (res <= 0)
00075 throw ConnectionClosed("Connection Closed", HERE);
00076 // _buffer += all octets received
00077 _buffer += std::string(chr, res);
00078 if (!size)
00079 {
00080 // extract size from _buffer and reduce it
00081 size = (unsigned char)_buffer[0] * 256 + (unsigned char)_buffer[1];
00082 _buffer = _buffer.substr(2, _buffer.size() - 2);
00083 }
00084 if (_buffer.size() > size - str.size())
00085 {
00086 str += _buffer.substr(0, size - str.size());
00087 _buffer = _buffer.substr(size - str.size(),
00088 _buffer.size() - size - str.size());
00089 }
00090 else
00091 {
00092 str += _buffer;
00093 _buffer = "";
00094 }
00095 if (str.size() >= size)
00096 end = true;
00097 }
00098 return str;
00099 }
|
|
||||||||||||||||||||
|
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 101 of file udpsocket.cc. References HERE, and Network::V4. 00104 {
00105 char chr[MAXPKTSIZE];
00106 std::string str = "";
00107 int res = 1;
00108 struct sockaddr_in addr;
00109 #ifdef IPV6_ENABLED
00110 struct sockaddr_in6 addr6;
00111 #endif
00112 #ifdef LIBSOCKET_WIN
00113 int size;
00114 #else
00115 socklen_t size;
00116 #endif
00117 bool end = false;
00118
00119 #ifdef IPV6_ENABLED
00120 if (V4 == _version)
00121 #endif
00122 size = sizeof(addr);
00123 #ifdef IPV6_ENABLED
00124 else
00125 size = sizeof(addr6);
00126 #endif
00127 if (socket < 0)
00128 throw NoConnection("No Socket", HERE);
00129 if (_buffer.size() >= 2 && !pkg_size)
00130 {
00131 pkg_size = (unsigned char)_buffer[0] * 256 + (unsigned char)_buffer[1];
00132 _buffer = _buffer.substr(2, _buffer.size() - 2);
00133 }
00134 if (pkg_size && _buffer.size() >= pkg_size)
00135 {
00136 str = _buffer.substr(0, pkg_size);
00137 _buffer = _buffer.substr(pkg_size, _buffer.size() - pkg_size);
00138 }
00139 else
00140 while (!end)
00141 {
00142 #ifdef LIBSOCKET_WIN
00143 int flags = 0;
00144 #else
00145 int flags = MSG_TRUNC;
00146 #endif
00147 #ifdef IPV6_ENABLED
00148 if (V4 == _version)
00149 #endif
00150 res = recvfrom(socket, chr, MAXPKTSIZE, flags,
00151 (struct sockaddr *) &addr, &size);
00152 #ifdef IPV6_ENABLED
00153 else
00154 res = recvfrom(socket, chr, MAXPKTSIZE, flags,
00155 (struct sockaddr *) &addr6, &size);
00156 #endif
00157 if (res <= 0)
00158 throw ConnectionClosed("Connection Closed", HERE);
00159 // _buffer += all octets received
00160 _buffer += std::string(chr, res).substr(0, res);
00161 if (!pkg_size)
00162 {
00163 // extract size from _buffer and reduce it
00164 pkg_size = (unsigned char)_buffer[0] * 256 +
00165 (unsigned char)_buffer[1];
00166 _buffer = _buffer.substr(2, _buffer.size() - 2);
00167 }
00168 if (_buffer.size() > pkg_size - str.size())
00169 {
00170 str += _buffer.substr(0, pkg_size - str.size());
00171 _buffer = _buffer.substr(pkg_size - str.size(),
00172 _buffer.size() - pkg_size - str.size());
00173 }
00174 else
00175 {
00176 str += _buffer;
00177 _buffer = "";
00178 }
00179 if (str.size() >= pkg_size)
00180 end = true;
00181 }
00182 #ifdef IPV6_ENABLED
00183 if (V4 == _version)
00184 {
00185 #endif
00186 host = std::string(inet_ntoa(addr.sin_addr));
00187 port = ntohs(addr.sin_port);
00188 #ifdef IPV6_ENABLED
00189 }
00190 else
00191 {
00192 char buf[INET6_ADDRSTRLEN];
00193 if (inet_ntop(AF_INET6, &addr6.sin6_addr, buf, INET6_ADDRSTRLEN) == 0)
00194 throw InetntopError("Not a valid address", HERE);
00195 host = std::string(buf);
00196 port = ntohs(addr6.sin6_port);
00197 }
00198 #endif
00199 return str;
00200 }
|
|
|
Close the connection.
Definition at line 39 of file udpsocket.cc. References Network::Socket::_close(). Referenced by ~UdpSocket(). 00040 {
00041 if (_socket > 0)
00042 _close(_socket);
00043 _socket = 0;
00044 }
|
|
|
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().
|
|
||||||||||||
|
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().
|
1.4.0