Skip to content
Snippets Groups Projects
Commit 3693c467 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@2325 b32b6428-25c9-4566-ad07-03861ab6144f
parent 9762728c
No related branches found
No related tags found
No related merge requests found
......@@ -35,14 +35,6 @@
#define MAXAGE 3600
void print_addr(struct sockaddr_storage *addr, socklen_t len) {
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);
else
fprintf(stderr, "getnameinfo: %s\n", gai_strerror(s));
}
int join_multicast(const char *addr, const char *port, int hops, struct sockaddr_storage *m_addr, socklen_t *m_len) {
......@@ -188,8 +180,17 @@ client_t *select_client(clients_t *clients, struct sockaddr_storage *addr, sockl
}
/*void print_addr(struct sockaddr_storage *addr, socklen_t len) {
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);
else
fprintf(stderr, "getnameinfo: %s\n", gai_strerror(s));
}*/
void add_client(clients_t *clients, struct sockaddr_storage *addr, socklen_t len) {
printf("New client "); print_addr(addr, len); printf("\n");
//printf("Add client "); print_addr(addr, len); printf("\n");
client_t *client = (client_t *) malloc( sizeof(client_t) );
memcpy(&(client->addr), addr, len);
client->len = len;
......@@ -199,7 +200,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");
//printf("Del client "); print_addr(addr, len); printf("\n");
client_t *client = select_client(clients, addr, len);
if (client) {
LIST_REMOVE(client, entries);
......@@ -270,9 +271,11 @@ 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)
if (s == -1) {
perror("sendto()");
if (s != r)
LIST_REMOVE(client, entries);
free(client);
} else if (s != r)
fprintf(stderr, "sendto(reflector): send %lu bytes over %lu\n", s, r);
}
}
......@@ -297,16 +300,18 @@ void reflector2multicast(int reflector, int multicast, struct sockaddr_storage *
s = sendto(multicast, buf, r, 0, (struct sockaddr *)m_addr, m_len);
if (s == -1)
perror("sendto(multicast)");
if (s != r)
else if (s != r)
fprintf(stderr, "sendto(multicast): send %lu bytes over %lu\n", s, r);
sender = select_client(clients, &addr, len);
LIST_FOREACH(client, clients, entries)
if (client != sender) {
s = sendto(reflector, buf, r, 0, (struct sockaddr *) &(client->addr), client->len);
if (s == -1)
if (s == -1) {
perror("sendto()");
if (s != r)
LIST_REMOVE(client, entries);
free(client);
} else if (s != r)
fprintf(stderr, "sendto(client): send %lu bytes over %lu\n", s, r);
}
......@@ -376,6 +381,7 @@ int main(int argc, char *argv[]) {
FD_SET(reflector, &rfds);
fd_max = (fd_max > reflector)? fd_max : reflector;
fd_max++;
FD_ZERO(&efds);
FD_SET(reflector, &efds);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment