tenrod
Messages postés46Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention11 décembre 2008
-
15 févr. 2008 à 22:45
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 2014
-
22 févr. 2008 à 10:44
Bonsoir a tous,
voila j'ai un petit (voire un gros) pb avec le développement d'une application me permettant de faire du multicast en c sous windows.
J'ai récupéré le code suivant qui logiquement devrait fonctionner :
[code]
/*
multicast.c
- Mark Claypool, 2001
The following program sends or receives multicast packets. If invoked
with one argument, it sends a packet containing the current time to an
arbitrarily chosen multicast group and UDP port. If invoked with no
arguments, it receives and prints these packets. Start it as a sender on
just one host and as a receiver on all the other hosts.
Mais voila à la compilation c'est le drame :
[code]
c:\documents and settings\administrateur\bureau\toto.c(9) : fatal error C1083: Cannot open include file: 'unistd.h': No such file or directory
c:\documents and settings\administrateur\bureau\toto.c(12) : fatal error C1083: Cannot open include file: 'netinet/in.h': No such file or directory
c:\documents and settings\administrateur\bureau\toto.c(13) : fatal error C1083: Cannot open include file: 'arpa/inet.h': No such file or directory
c:\documents and settings\administrateur\bureau\toto.c(14) : fatal error C1083: Cannot open include file: 'netdb.h': No such file or directory
[\code]
Bref je comprend bien la qu'il s'agit de problèmes de référence à ces différents fichiers mais ma question est la suivante :
quelles librairies dois je utiliser ?
en cherchant sur le net (et oui google ami du développeur) j'ai lu qu'il s'agirait de librairies unix et pas dispo sur windows est ce que ce post que j'ai vu est dans le vrai ?
Si oui quelqu'un a - t - il un bout de code avec les libs nécessaires pour faire communiquer deux postes en multicast ?
Je vous remercie d'avance pour vos réponses.
Vinzouille
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 16 févr. 2008 à 18:38
Salut,
Tu peux virer les trois quarts des includes. stdio, time et winsock devrait suffires.
Plus d'infos sur la compatibilité socket Linux/Windows.
Il faut appeler WSAStartup et WSACleanup.
#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);
/*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");
}
tenrod
Messages postés46Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention11 décembre 2008 22 févr. 2008 à 10:08
Je suis sous dev c++.
Mon OS est windows XP media center
Le pire c'est que j'ai un autre bout de code qui utilise cette méthode et la ça passe ...
Je vais relire encore et encore mon code (même si je doute que ça serve a quelquechose) histoire de voir si j'ai pas zappé une partie vitale ...
tenrod
Messages postés46Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention11 décembre 2008 22 févr. 2008 à 10:22
Bon finalement la relecture a porté ses fruits !
C'est fou ce que ça fait du bien une bonne nuit de sommeil lool
Alors pour ceux que ça intéresse voici le code revu et corrigé :
#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("WSAStartup() 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");
}
/*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 erreur");
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");
}