Skip to content
Snippets Groups Projects
Commit 742d6fab authored by clohr's avatar clohr
Browse files

Réflecteur unicast-multicast

git-svn-id: https://redmine.imt-atlantique.fr/svn/xaal/code/C/branches/version-0.7@2335 b32b6428-25c9-4566-ad07-03861ab6144f
parent 9ffd9084
No related branches found
No related tags found
No related merge requests found
......@@ -180,17 +180,18 @@ client_t *select_client(clients_t *clients, struct sockaddr_storage *addr, sockl
}
/*void print_addr(struct sockaddr_storage *addr, socklen_t len) {
/*void print_addr(struct sockaddr_storage *addr, socklen_t len, const char *msg) {
char host[NI_MAXHOST], service[NI_MAXSERV];
int s = getnameinfo((struct sockaddr *)addr, len, host, NI_MAXHOST, service, NI_MAXSERV, NI_NUMERICHOST|NI_NUMERICSERV);
if (s == 0)
printf("[%s]:%s", host, service);
printf("%s [%s]:%s\n", msg, host, service);
else
fprintf(stderr, "getnameinfo: %s\n", gai_strerror(s));
}*/
void add_client(clients_t *clients, struct sockaddr_storage *addr, socklen_t len) {
//printf("Add client "); print_addr(addr, len); printf("\n");
//print_addr(addr, len, "Add client");
client_t *client = (client_t *) malloc( sizeof(client_t) );
memcpy(&(client->addr), addr, len);
client->len = len;
......@@ -200,7 +201,7 @@ void add_client(clients_t *clients, struct sockaddr_storage *addr, socklen_t len
void del_client(clients_t *clients, struct sockaddr_storage *addr, socklen_t len) {
//printf("Del client "); print_addr(addr, len); printf("\n");
//print_addr(addr, len, "Del client");
client_t *client = select_client(clients, addr, len);
if (client) {
LIST_REMOVE(client, entries);
......@@ -221,7 +222,7 @@ void old_clients(clients_t *clients) {
void check_reflector(int reflector, clients_t *clients) {
char buf[1024];
char buf[1280];
char ctr[1024];
struct iovec iov[1];
......@@ -243,7 +244,7 @@ void check_reflector(int reflector, clients_t *clients) {
perror("recvmsg(MSG_ERRQUEUE)");
return;
}
if (message.msg_flags != MSG_ERRQUEUE)
if ( (message.msg_flags & MSG_ERRQUEUE) != MSG_ERRQUEUE)
return;
struct cmsghdr *cmsg;
......@@ -252,7 +253,7 @@ void check_reflector(int reflector, clients_t *clients) {
if ( (cmsg->cmsg_level == IPPROTO_IPV6) && (cmsg->cmsg_type == IPV6_RECVERR) ) {
sock_err = (struct sock_extended_err*)CMSG_DATA(cmsg);
if (sock_err && (sock_err->ee_origin == SO_EE_ORIGIN_ICMP6) && (sock_err->ee_type == ICMPV6_DEST_UNREACH) )
del_client(clients, &addr, message.msg_iovlen);
del_client(clients, &addr, message.msg_namelen);
}
}
}
......@@ -271,11 +272,9 @@ void multicast2reflector(int multicast, int reflector, clients_t *clients) {
LIST_FOREACH(client, clients, entries) {
s = sendto(reflector, buf, r, 0, (struct sockaddr *) &(client->addr), client->len);
if (s == -1) {
perror("sendto()");
LIST_REMOVE(client, entries);
free(client);
} else if (s != r)
if (s == -1)
check_reflector(reflector, clients);
else if (s != r)
fprintf(stderr, "sendto(reflector): send %lu bytes over %lu\n", s, r);
}
}
......@@ -307,11 +306,9 @@ void reflector2multicast(int reflector, int multicast, struct sockaddr_storage *
LIST_FOREACH(client, clients, entries)
if (client != sender) {
s = sendto(reflector, buf, r, 0, (struct sockaddr *) &(client->addr), client->len);
if (s == -1) {
perror("sendto()");
LIST_REMOVE(client, entries);
free(client);
} else if (s != r)
if (s == -1)
check_reflector(reflector, clients);
else if (s != r)
fprintf(stderr, "sendto(client): send %lu bytes over %lu\n", s, r);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment