Pb abonnement pour socket multicast

Résolu
Spiffou Messages postés 100 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 9 juin 2014 - 7 sept. 2007 à 12:33
Spiffou Messages postés 100 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 9 juin 2014 - 10 sept. 2007 à 16:16
bonjour à tous,

je rencontre un problème de programmation réseau sur les sockets (c++ sous visual studio).
Je cherche à programmer une classe de gestion du multicast (udp) qui ne manipule qu'un seul socket pour envoyer et recevoir.
Cette classe est déjà fonctionnelle en unicast et les échanges en localhost fonctionnent sans aucun probleme (gestion des E/S avec select).
cependant pour gérer le multicast, il faut que je m'abonne au canal de diffusion, et c'est là que les problème commencent: l'abonnement ne marche pas, et ma commande
"err =setsockopt(_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*) &stMreq, sizeof(stMreq));"
me renvoie -1 en permanence...

voila ce que je fais:
_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP/*0*/); // creation socket

int val = 1;
error = setsockopt(_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(int));
error = setsockopt(_socket, SOL_SOCKET, SO_BROADCAST, (char *)&val, sizeof(int));

// set non-blocking socket
mode = 1; // non bloquant si != 0
error = ioctlsocket(_socket, FIONBIO, &mode);
error = ioctlsocket(_socket, FIONREAD, &mode);

// on spécifie le port à utiliser port = 5000
dsock.sin_addr.s_addr = htonl(INADDR_ANY);
dsock.sin_family = AF_INET;
dsock.sin_port = htons((u_short)port);
error = bind(_socket, (sockaddr *)(&dsock), sizeof(sockaddr_in));

// renseignement de l'@ destination destIp = 224.0.1.1
sockaddr_in fsock;
fsock.sin_addr.s_addr = inet_addr(destIp);
fsock.sin_port = htons((u_short)destPort);
fsock.sin_family = AF_INET;

// autorise à recevoir les msg venant de l'@ de l'envoyeur
u_char loop = 1;
error =setsockopt(_socket, IPPROTO_IP, IP_MULTICAST_LOOP, (char*) &loop, sizeof(u_char)); // ??????

// définition de l'abonnement
struct ip_mreq stMreq;
stMreq.imr_multiaddr.s_addr = fsock.sin_addr.s_addr;
stMreq.imr_interface.s_addr = INADDR_ANY;
error =setsockopt(_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*) &stMreq, sizeof(stMreq)); // ??????
// là ce me renvoie tjs "-1" arrgghhhh!!!

// envoie des données
nbSend = sendto(_socket, (char *)msg, msgSize, 0, (sockaddr *)(&fsock), sizeof(sockaddr_in));

à la suite de tout ca, les données semblent être envoyées, mais le select ne "détecte" rien et du coup je n'appelle pas ma procedure pour la réception... mais ca j'imagine que c'est normal de pas etre notifier des messages circulant sur un canal multicast auquel on est pas abonné...
/!\ ATTENTION, je fais la procedure de réception (select et recvfrom) avec la même socket!

note: à priori, pas de problème réseau ou autre car j'ai réussi à faire marcher un petit programme de test client/server en multicast sur ma machine...

voila la situation. si quelqu'un saurait me dire ce qui cloche, ca m'aiderait bien.

1 réponse

Spiffou Messages postés 100 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 9 juin 2014 1
10 sept. 2007 à 16:16
bon ben en fait la solution etait toute bete (j'ai honte), j'avais inclus winsock.h et non pas winsock2.h (en mm tps visual aurait pu me faire une erreur qd même)...
cette erreur corrigée tout va forcément beaucoup mieux avis aux amateurs, soyez pas distrait.

@+
3
Rejoignez-nous