IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

multicast, cygwin, xp et vista


Sujet :

Réseau C

  1. #1
    Invité(e)
    Invité(e)
    Par défaut multicast, cygwin, xp et vista
    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...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Problème résolu,

    Il suffisait d'appeler bind avant setsockopt ( IP_ADD_MEMBERSHIP ).

    Citation Envoyé par http://support.microsoft.com/kb/131978/EN-US/
    Note that it is necessary to bind to an address before calling the setsockopt() function.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    57
    58
    59
    60
    61
    62
    63
    #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;
     
     
        /* bind */
        if (bind(sock , (struct sockaddr *) to, sizeof(struct sockaddr_in))
            < 0) {
            perror("bind");
            exit(1);
        }
     
        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;
    }

Discussions similaires

  1. cygwin sur vista
    Par clement.rey dans le forum Windows Vista
    Réponses: 1
    Dernier message: 22/09/2008, 23h08
  2. Fortran sous Vista : problèmes avec cygwin
    Par crow56 dans le forum Fortran
    Réponses: 3
    Dernier message: 18/07/2008, 13h33
  3. Réponses: 4
    Dernier message: 28/05/2008, 21h56
  4. [PostgreSQL] Fonct. anormal de postmaster sous Cygwin
    Par moipastoi dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 14/03/2003, 13h13
  5. Utilisation de Cygwin??
    Par don-diego dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 19/07/2002, 14h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo