Salut a tous!
J'ai malheureusement un pb supplémentaire avec mes socket en multicast ...
ça se passe a ce niveau
if ((setsockopt(sock_rec, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void*) &mc_req, sizeof(mc_req))) < 0)
{
printf("setsockopt - IP_ADD_MEMBERSHIP");
system("PAUSE");
exit(1);
}
en fait le "IP_ADD_MEMBERSHIP" ne passe pas, y'a t'il une manipulation spéciale a faire sur ma machine ou y'a il erreur de code?
pour info voici tout le code :
#include <sys/types.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define GROUP "239.137.194.222"
#define PORT 55501
#define MAX_LEN 1024 //taille max réception
int main()
{
int reuse;
int sock_rec; /* descripteur socket */
int flag_on = 1; /* flag socket */
struct sockaddr_in mc_addr_rec; /* structure d'adresse de la socket reception */
char recv_str[MAX_LEN+1]; /* buffer de réception */
int recv_len; /* longueur de la string en réception */
struct ip_mreq mc_req; /* structure multicast */
struct sockaddr_in from_addr; /* source */
unsigned int from_len; /* longueur source */
WSADATA wsaData; /* structure DLL socket Windows */
int sock_send; /* descripteur socket */
char send_str[MAX_LEN]; /* string à envoyer */
int send_len; /* longueur string à envoyer */
struct sockaddr_in mc_addr_send; /* structure d'adresse de la socket emission */
unsigned char ttl=1; /* time to live */
/* Initialisation de Winsock */
if (WSAStartup(MAKEWORD(2,0), &wsaData)!=0)
{
printf("\nWSAStartup() erreur");
}
/* création de la socket de réception */
if ((sock_rec = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
{
printf("socket() reception erreur");
}
/* création de la socket de d'émission */
if ((sock_send = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
{
printf("socket() emission erreur");
}
/*initialisation de la socket de reception*/
memset(&mc_addr_rec, 0, sizeof(mc_addr_rec));
mc_addr_rec.sin_family = AF_INET;
mc_addr_rec.sin_addr.s_addr = htonl(INADDR_ANY);
mc_addr_rec.sin_port = htons(PORT);
/*initialisation de la socket d'emission*/
memset(&mc_addr_send, 0, sizeof(mc_addr_send));
mc_addr_send.sin_family = AF_INET;
mc_addr_send.sin_addr.s_addr = htonl(INADDR_ANY);
mc_addr_send.sin_port = htons(PORT);
recv_len = sizeof(mc_addr_rec);
from_len = sizeof(mc_addr_send);
if ((setsockopt(sock_rec, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void*) &mc_req, sizeof(mc_req))) < 0)
{
printf("setsockopt - IP_ADD_MEMBERSHIP");
system("PAUSE");
exit(1);
}
if (bind(sock_rec, (struct sockaddr *)&mc_addr_rec, sizeof(mc_addr_rec)) < 0)
{
printf("bind");
system("PAUSE");
exit(1);
}
/*réception des datagrammes*/
while (1)
{
if (recvfrom(sock_rec, recv_str, sizeof(recv_str), 0, (struct sockaddr *)&mc_addr_rec, &recv_len) < 0)
{
printf("recvfrom");
system("PAUSE");
exit(1);
}
else
{ /* fin de transmission */
break;
}
printf("%s\n", recv_str); /* affichage du message */
}
/*opération qui permet de fixer la valeur du TTL*/
if (setsockopt(sock_send, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) == -1)
{
printf("setsockopt: IP_MULTICAST_TTL");
}
/*emission des datagrammes*/
if (sendto(sock_send, send_str, strlen(send_str), 0, (struct sockaddr *)&mc_addr_send, send_len) < 0)
{
printf("sendto");
system("PAUSE");
exit(1);
}
/*quitter le groupe*/
if (setsockopt(sock_rec, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mc_req, sizeof(mc_req)) == -1)
{
printf("setsockopt: IP_DROP_MEMBERSHIP");
}
/*port réutilisable*/
reuse = 1;
if (setsockopt(sock_rec, SOL_SOCKET, SO_REUSEADDR, (int *)&reuse, sizeof(reuse)) == -1) {
printf("setsockopt: SO_REUSEADDR");
}
system("PAUSE");
return 0;
}
Vinzouille