From 3dd4fc30ec45e343c6acd4cfbf211a4cabddc7fe Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Thu, 7 Dec 2017 19:34:31 +0100 Subject: [PATCH] rewrite multicast setup --- src/include/multicastsocket.h | 2 ++ src/include/networksocket.h | 2 +- src/main.c | 1 + src/network/multicastsocket.c | 16 ++++++++++++++-- src/network/networksocket.c | 17 ++++++++++++----- 5 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/include/multicastsocket.h b/src/include/multicastsocket.h index fe305e0..3b8e86d 100644 --- a/src/include/multicastsocket.h +++ b/src/include/multicastsocket.h @@ -3,4 +3,6 @@ int setup_multicast_socket(const char *_multicast_ip, unsigned short _multicast_port, struct sockaddr_in *addr); +int remove_multicast_socket(int socket); + #endif diff --git a/src/include/networksocket.h b/src/include/networksocket.h index 5b04f3e..4e11724 100644 --- a/src/include/networksocket.h +++ b/src/include/networksocket.h @@ -5,7 +5,7 @@ pthread_mutex_t send_mutex; -int init_socket_runopts(char *_ip, char *_port, int broadcast_socket); +int init_socket_runopts(char *_ip, char *_port, int _multicast_socket); int send_string(char *msg); diff --git a/src/main.c b/src/main.c index a688a0a..e7a9a0a 100644 --- a/src/main.c +++ b/src/main.c @@ -21,6 +21,7 @@ struct sigaction newSigAction; void daemon_shutdown() { // kill threads + close_socket(); printf("Cancelling Threads!\n"); uloop_cancelled = true; diff --git a/src/network/multicastsocket.c b/src/network/multicastsocket.c index 0ff6a95..b67499e 100644 --- a/src/network/multicastsocket.c +++ b/src/network/multicastsocket.c @@ -11,7 +11,7 @@ #include "multicastsocket.h" -static struct ip_mreq command; /* static ?! */ +static struct ip_mreq command; int setup_multicast_socket(const char *_multicast_ip, unsigned short _multicast_port, struct sockaddr_in *addr) { int loop = 1; @@ -57,7 +57,7 @@ int setup_multicast_socket(const char *_multicast_ip, unsigned short _multicast_ command.imr_multiaddr.s_addr = inet_addr(_multicast_ip); command.imr_interface.s_addr = htonl (INADDR_ANY); if (command.imr_multiaddr.s_addr == -1) { - perror("224.0.0.1 ist keine Multicast-Adresse\n"); + perror("Wrong multicast address!\n"); exit(EXIT_FAILURE); } if (setsockopt(sock, @@ -67,4 +67,16 @@ int setup_multicast_socket(const char *_multicast_ip, unsigned short _multicast_ perror("setsockopt:IP_ADD_MEMBERSHIP"); } return sock; +} + +int remove_multicast_socket(int socket) +{ + if (setsockopt ( socket, + IPPROTO_IP, + IP_DROP_MEMBERSHIP, + &command, sizeof (command)) < 0 ) { + perror ("setsockopt:IP_DROP_MEMBERSHIP"); + return -1; + } + return 0; } \ No newline at end of file diff --git a/src/network/networksocket.c b/src/network/networksocket.c index 6258ae5..ed33e02 100644 --- a/src/network/networksocket.c +++ b/src/network/networksocket.c @@ -29,21 +29,23 @@ const char *ip; unsigned short port; char recv_string[MAX_RECV_STRING + 1]; int recv_string_len; +int multicast_socket; void *receive_msg(void *args); void *receive_msg_enc(void *args); -int init_socket_runopts(char *_ip, char *_port, int broadcast_socket) { +int init_socket_runopts(char *_ip, char *_port, int _multicast_socket) { port = atoi(_port); ip = _ip; + multicast_socket = _multicast_socket; - if (broadcast_socket) { - sock = setup_broadcast_socket(ip, port, &addr); - } else { + if (multicast_socket) { printf("Settingup multicastsocket!\n"); sock = setup_multicast_socket(ip, port, &addr); + } else { + sock = setup_broadcast_socket(ip, port, &addr); } pthread_t sniffer_thread; @@ -235,4 +237,9 @@ int send_string_enc(char *msg) { return 0; } -void close_socket() { close(sock); } +void close_socket() { + if(multicast_socket){ + remove_multicast_socket(sock); + } + close(sock); +}