Bonjour,
J'ai réalisé un petit client multicast pour récupérer des données provenant d'un serveur réalisé lui aussi par mes soins.
Le serveur fonctionne sans problème.
Le client, lui, pose problème : sous vista, pas de problème, sous XP ça coince, la fonction setsockopt n'a pas l'air d'apprécier le multicast...
setsockopt: IP_ADD_MEMBERSHIP: Invalid argument
Je ne pense pas me servir correctement de la fonction setsockopt, et je dois avouer que je suis un peu perdu...
Pour réaliser ce bout de code, je me suis fait aidé par cette page.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket(s) close(s)
typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;
typedef struct in_addr IN_ADDR;
int main(void)
{
unsigned short port = 7766;
char ip[] = "224.0.0.1";
/* socket creation */
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
if (INVALID_SOCKET == sock) {
perror("socket()");
exit(errno);
}
/* connection to server */
SOCKADDR_IN to;
to.sin_family = AF_INET;
to.sin_port = htons(port);
to.sin_addr.s_addr = htonl(INADDR_ANY);
struct ip_mreq imr;
imr.imr_multiaddr.s_addr = inet_addr(ip); /* multicast group to join */
imr.imr_interface.s_addr = htonl(INADDR_ANY); /* interface to read on */
/* set socket options. */
if (setsockopt
(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void *) &imr,
sizeof(imr)) < 0) {
perror("setsockopt: IP_ADD_MEMBERSHIP");
exit(errno);
} else {
printf("ok");
}
/*
ici le reste du code
*/
return 0;
} |
Si vous avouez une idée, merci d'avance.
Partager