URL: https://linuxfr.org/forums/linux-general/posts/probl%C3%A8me-multicast-et-udp Title: Problème multicast et UDP Authors: undine Date: 2006年12月13日T17:21:42+01:00 Tags: Score: 0 Bonjour, Je veut créer un logiciel en C (ou C++, peut m'importe) pouvant diffuser à plusieurs machines à la fois une information sur un réseau local. De plus, je veut qu'une machine émettant sur le réseau ne reçoive pas l'information qu'elle a diffusée. Pour cela j'ai utilisé le multicast avec une socket UDP. Voici le code partiel de mon programme : £spaces£ £/spaces£//Je crée ma socket UDP £spaces£ £/spaces£struct sockaddr_in serv_addr; £spaces£ £/spaces£sock = socket(AF_INET, SOCK_DGRAM, 0); £spaces£ £/spaces£if(sock == -1) {printError("Erreur lors de la creation du socket"); return 1;} £spaces£ £/spaces£int optReUseAddr = 1; £spaces£ £/spaces£setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optReUseAddr, sizeof(int)); £spaces£ £/spaces£ £spaces£ £/spaces£if (inet_aton("224.0.0.1", &serv_addr.sin_addr) < 0) {perror("inet_aton serv_addr"); return 1;} £spaces£ £/spaces£serv_addr.sin_port = htons(port); £spaces£ £/spaces£serv_addr.sin_family = AF_INET; £spaces£ £/spaces£if (bind(sock, (struct sockaddr *) (&serv_addr), sizeof(serv_addr)) < 0) £spaces£ £/spaces£{perror("CREATE CONN : erreur lors du bind "); return 1;} £spaces£ £/spaces£/* ... */ £spaces£ £/spaces£ £spaces£ £/spaces£//J'ajoute ma socket au groupe de multicast correspondant au réseau local ("224.0.0.1") £spaces£ £/spaces£struct ip_mreq mreq; £spaces£ £/spaces£int i=0; £spaces£ £/spaces£ £spaces£ £/spaces£if (inet_aton("224.0.0.1", &mreq.imr_multiaddr) < 0) {perror("inet_aton mreq"); return 1;} £spaces£ £/spaces£mreq.imr_interface.s_addr = htonl(INADDR_ANY); £spaces£ £/spaces£if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) £spaces£ £/spaces£{perror("setsockopt IP_ADD_MEMBERSHIP "); return 1;} £spaces£ £/spaces£ £spaces£ £/spaces£/* ... */ £spaces£ £/spaces£ £spaces£ £/spaces£//Je désactive la réception par une machine de ses propres messages : £spaces£ £/spaces£if (setsockopt(sock, SOL_IP, IP_MULTICAST_LOOP, &i, sizeof(int)) < 0) £spaces£ £/spaces£{perror("setsockopt multicast "); return 1;} £spaces£ £/spaces£/* ... */ £spaces£ £/spaces£ £spaces£ £/spaces£//Initialisation terminée : j'envoi et je receoit les données (la reception se fait dans un thread différent) £spaces£ £/spaces£nbrOctetEnv = sendto(sock, buff, strlen(buff), MSG_NOSIGNAL, (struct sockaddr *)(&serv_addr), sizeof(serv_addr)); £spaces£ £/spaces£nbrOctetRecv = recvfrom(param.sockComm, buff, 1024, MSG_NOSIGNAL, (struct sockaddr *)(&serv_addr), &i); Tout cela compile et fonctionne correctement. Or je désire exécuter ce code sur une carte. Pas de problème là non plus : la compilation et l'initialisation de la socket se font correctement. Cependant dans un premier temps la carte ne recevait ni ne multicastait de données sur le réseau. J'ai rajouté une route 'default' à la table de routage ce qui m'a permis de régler le problème de l'envoi mais pas de la réception. J'aurai donc plusieurs questions : - Est-ce que le multicast est la solution la plus propre et la mieux adaptée pour diffuser de l'information à plusieurs machine à la fois ? - Le multicast est-il plus proprope et / ou plus performant que le broadcast ? - Si le broadcast est plus adapté, quelqu'un sait-il comment stopper la reception par une une machine de trames qu'elle a elle-même envoyée ? J'ai cherché des options pour le setsockopt mais je n'ai rien trouvé. - Mon code est-il correct ? La configuration de ma socket est-elle complète ou manque-t-il des parties nécessaires pour un noyau seul mais gérées automatiquement par une distributon ? - Mon problème ne viendrai-t-il pas du fait que mon PC (distrib Mandriva 2007) configure automatiquement quelque chose permettant la réception des trames, chose que ne doit pas faire le linux embarqué sur la carte (pas de distrib). Quelqu'un sait-il d'où cela peut venir ? - J'ai remarqué que sur mon PC j'ai une adresse IPV6 assignée mon interface eth0 et pas sur ma carte. Est-il nécessaire que les deux machines gèrent IPV6 (j'en doute) ? Merci d'avance pour vos réponse

AltStyle によって変換されたページ (->オリジナル) /