37 #include <core/threading/thread.h> 38 #include <netcomm/socket/datagram_multicast.h> 39 #include <utils/system/signal.h> 40 #include <utils/system/argparser.h> 45 #include <netinet/in.h> 49 class MulticastDatagramServerThread :
public Thread 52 MulticastDatagramServerThread(
unsigned short int port,
bool looping)
53 :
Thread(
"MulticastDatagramServerThread",
Thread::OPMODE_CONTINUOUS)
66 ~MulticastDatagramServerThread()
68 printf(
"Closing server socket\n");
70 printf(
"Closed server socket\n");
77 printf(
"Sending %u\n", i);
78 s->send(&i,
sizeof(i));
79 printf(
"Sent %u\n", i);
81 from_len =
sizeof(from);
82 printf(
"Receiving\n");
83 s->recv(&ri,
sizeof(ri), (
struct sockaddr *)&from, &from_len);
85 printf(
"ERROR: sent %u but received %u\n", i, ri);
87 printf(
"OK: sent %u and received %u\n", i, ri);
91 printf(
"Loop failed\n");
100 struct sockaddr_in from;
101 unsigned int from_len;
104 class MulticastDatagramReflectorThread :
public Thread 107 MulticastDatagramReflectorThread(
unsigned short int port)
108 :
Thread(
"MulticastDatagramReflectorThread",
Thread::OPMODE_CONTINUOUS)
117 from_len =
sizeof(from);
120 ~MulticastDatagramReflectorThread()
122 printf(
"Closing reflector socket\n");
124 printf(
"Closed reflector socket\n");
131 printf(
"Waiting for data to reflect\n");
132 s->recv(&i,
sizeof(i), (
struct sockaddr *)&from, &from_len);
133 printf(
"Received %u, reflecting\n", i);
134 s->send(&i,
sizeof(i));
139 struct sockaddr_in from;
140 unsigned int from_len;
153 printf(
"Going to be a reflector\n");
154 r =
new MulticastDatagramReflectorThread(1910);
156 bool looping = argp->
has_arg(
"l");
158 printf(
"Enabling local loop (we receive own traffic)\n");
160 s =
new MulticastDatagramServerThread(1910, looping);
164 ~MulticastDatagramSocketQAMain()
171 virtual void handle_signal(
int signum)
173 printf(
"Signal received, cancelling threads\n");
174 if ( s != NULL ) s->cancel();
175 if ( r != NULL ) r->cancel();
176 printf(
"Threads cancelled\n");
193 MulticastDatagramServerThread *s;
194 MulticastDatagramReflectorThread *r;
199 main(
int argc,
char **argv)
203 MulticastDatagramSocketQAMain m(argp);
Fawkes library namespace.
Interface for signal handling.
Parse command line arguments.
Thread class encapsulation of pthreads.
Base class for exceptions in Fawkes.
Multicast datagram socket.
static void ignore(int signum)
Ignore a signal.
static SignalHandler * register_handler(int signum, SignalHandler *handler)
Register a SignalHandler for a signal.
void print_trace()
Prints trace to stderr.
bool has_arg(const char *argn)
Check if argument has been supplied.