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

C Discussion :

setsockopt failed! Error: 10049 (multicast socket)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de beau_g
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 26
    Par défaut setsockopt failed! Error: 10049 (multicast socket)
    Bonjour à tous,

    Je cherche à envoyer et recevoir un message en multicast d'un 'serveur' vers un 'client'. J'ai donc créée deux projet S et C, l'un contenant une fonction multiSocketRcvfrom() et l'autre multiSocketSendto.h...j'ai donc réussi à envoyer le message via la seconde fonction, mais je n'arrive pas à le réceptionner avec la première...

    fonction multiSocketRcvfrom() :
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    #include "multiSocketRcvfrom.h"
     
    int multiSocketRcfrom(int port_dest, char *rcv_ip_addr){
        int iRecvLen, cb;                       // Length of recv_sin
        char szMessage[100];                // ASCII string
     
        SOCKET Sock = INVALID_SOCKET;       // Datagram window socket
     
        struct ip_mreq mreq;                // Used in adding or dropping
                                            // multicasting addresses
        SOCKADDR_IN local_sin,              // Local socket's address
                    recv_sin;               // Holds the source address upon
                                            // recvfrom function returns
        #ifdef _WIN32
        WSADATA WSAData;                    // Contains details of the
                                          // Winsock implementation
     
        // Initialize Winsock.
        if (WSAStartup (MAKEWORD(1,1), &WSAData) == 0)
        {
            printf( "WSAStartup succeed.\n");
        }
        else
        {
        	printf( "WSAStartup failed! Error: %d\n", SOCKET_ERRNO);
            return FALSE;
        }
        #endif
     
        // Create a datagram socket, Sock.
        if ((Sock = socket (AF_INET, SOCK_DGRAM, 0)) != -1)
        {
            printf( "Allocating socket succeed.\n");
        }
        else
        {
        	printf( "Allocating socket failed! Error: %d\n", SOCKET_ERRNO);
            return FALSE;
        }
     
        // Fill out the local socket's address information.
        local_sin.sin_family = AF_INET;
        local_sin.sin_port = htons (port_dest);
        local_sin.sin_addr.s_addr = htonl (INADDR_ANY);
     
        // Associate the local address with Sock.
        if (bind (Sock,
                 (struct sockaddr FAR *) &local_sin,
                  sizeof (local_sin)) == SOCKET_ERROR)
        {
        	printf( "Binding socket failed! Error: %d\n", SOCKET_ERRNO);
        	closesocket (Sock);
            return FALSE;
        }
     
        // Join the multicast group from which to receive datagrams.
        mreq.imr_multiaddr.s_addr = inet_addr (rcv_ip_addr);
        mreq.imr_interface.s_addr = INADDR_ANY;
     
        if (setsockopt (Sock,
                        IPPROTO_IP,
                        IP_ADD_MEMBERSHIP,
                        (char FAR *)&mreq,
                        sizeof (mreq)) == SOCKET_ERROR)
        {
        	printf( "setsockopt failed! Error: %d\n", SOCKET_ERRNO);
        	closesocket (Sock);
        	return FALSE;
        }
     
        iRecvLen = sizeof (recv_sin);
     
        // Receive data from the multicasting group server.
        if( (cb = recvfrom (Sock,
        					szMessage,
    						100,
    						0,
    						(struct sockaddr FAR *) &recv_sin,
    						&iRecvLen)) != -1)
        {
        	printf("successful message reception.\n");
        	szMessage[cb] = 0;
            printf( szMessage );
        }
        else
        {
        	printf( "recvfrom failed! Error: %d\n", SOCKET_ERRNO);
        	closesocket (Sock);
        	return FALSE;
        }
     
        // Disable receiving on Sock before closing it.
        shutdown (Sock, 0x00);
     
        // Close Sock.
        closesocket (Sock);
     
        return TRUE;
     
    }
    L'erreur suivant apparaît:
    WSAStartup succeed.
    Allocating socket succeed.
    Binding succeed

    setsockopt failed! Error: 10049
    D'après mes recherches, c'est une question de compatibilité d'adresse IP, mais je ne vois pas laquelle.

    Le problème se trouvant dans cette partie, avez vous des idées ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    setsockopt (Sock,
                        IPPROTO_IP,
                        IP_ADD_MEMBERSHIP,
                        (char FAR *)&mreq,
                        sizeof (mreq)) == SOCKET_ERROR)

    L'addresse IP et le port que j'ai utilisé pour envoyer le message sont respectivement : "192.168.0.1" et 7


    Merci d'avance pour vos réponses,


    Bien à vous


    beaug

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Le multicast n'utilise-t-il pas une plage d'adresses IP spécifique?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonsoir
    Citation Envoyé par Médinoc Voir le message
    Le multicast n'utilise-t-il pas une plage d'adresses IP spécifique?
    Si justement et je ne vois aucunement où est-ce que l'on gère la socket pour pouvoir faire partir d'un groupe de machine dans setsockopt (enfin avant d'appeler setsockopt) D'où l'erreur, mais le message d'erreur est tout aussi clair. Cela veut tout simplement dire qu'il existe déjà une option de socket existant et donc il y a conflit d'options : toutefois, si ce n'est pas le cas essayer ceci.

    Code C : 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
     
    int f_j_group_multic( int fd, u_int32 group, u_int32, 
        src_addr, u_int32 intrf_addr ){
     
        /*
        *   ip_mreq_source doit être utilisée avec une adresse IPv4. 
        *   mais aussi avec les options de socket definis
        */
        struct ip_mreq_source src;
        /*
        *   L'adresse de la source de multidiffusion IPv4.
        */
        src.imr_sourceaddr.s_addr = src_addr;
     
        /*
        *   configuration de l'adresse IPv4 locale de votre interface réseaux 
        *   sur lequel le groupe de multidiffusion doit être joint
        */
        src.imr_interface.s_addr = intrf_addr;  
     
        /*
        *   configuration adresse du groupe multidiffusion en IPv4.
        */
        src.imr_multiaddr.s_addr = group;
     
        /*
        *   définition des options et retour du status
        */
        return setsockopt(fd, IPPROTO_IP, 
            IP_ADD_SOURCE_MEMBERSHIP,(char*)&src, sizeof(src) );
    }
     
     
    /*
    *   Fonction de retrait du groupe multicasting
    */
    int f_reset_group_multic( int fd, u_int32 group, u_int32, 
        src_addr, u_int32 intrf_addr ){
     
        struct ip_mreq_source src;
        src.imr_sourceaddr.s_addr = src_addr;
        src.imr_interface.s_addr = intrf_addr;  
        src.imr_multiaddr.s_addr = group;
        return setsockopt(fd, IPPROTO_IP, 
            IP_DROP_SOURCE_MEMBERSHIP,(char*)&src, sizeof(src) );
    }
     
    /*
    *   Test de retour
    */
    if( -1 == f_j_group_multic(isocket, u_groupe, u_addr, u_intrf) ){
        (void)fprintf(stderr, "Erreur (%d)\t:%s\n\t:%s\n", errno
            "Erreur socket multicast option ", strerror(errno) );
        return EXIT_FAILURE;
    }
     
    if( -1 == f_reset_group_multic(isocket, u_groupe, u_addr, u_intrf) ){
        (void)fprintf(stderr, "Erreur (%d)\t:%s\n\t:%s\n", errno
            "Erreur socket multicast drop option", strerror(errno) );
        return EXIT_FAILURE;
    }

    à bientôt

  4. #4
    Membre averti Avatar de beau_g
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 26
    Par défaut
    Bonsoir,

    merci pour vos réponses, en effet j'ai vu que la plage des IP pour du multicast s'étend entre 224.0.0.0 jusqu'à 239.255.255.255, lorsque je change l'addresse je passe à l'erreur:

    Binding socket failed! Error: 10048

    Sambia39, je ne pense pas qu'il y est de confit je vais vérifier et j'essaie ce que tu m'as envoyé !

  5. #5
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonjour
    d'accord, vous avez une erreur Binding socket failed! Error: 10048 donc :
    ->soit le port souhaité est utilisé (ou est en cours d’utilisations)
    ->soit votre programme essaie d'utiliser une plage de port réservé ou ; parce qu’il y a partage de connexion sur la machine hôte.

    Tout de même, il faut corriger les options de socket (dans votre précédent code source) il faut mettre la source, c'est-à-dire l’émetteur qui émet vers le groupe de récepteurs en question.


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       /*
        *   L'adresse de la source de multidiffusion.
        */
        mreq.imr_sourceaddr.s_addr = src_addr;

    à bientôt

  6. #6
    Membre averti Avatar de beau_g
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 26
    Par défaut
    bonjour !

    Merci pour ta réponse

    Pourrez tu me dire à quelles endroits je dois placer les 2 fonctions f_j_group_multic() et f_reset_group_multic() ?

  7. #7
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonjour;
    L’utilisation des fonctions est simple :
    la première fonction int f_j_group_multic permet un ajout dans le groupe. La seconde int f_reset_group_multic permet le retrait (IP ADD SOURCE MEMBERSHIP et IP DROP SOURCE MEMBERSHIP). Si vous voulez ajouter une machine au groupe, on utilisera la première fonction si c’est pour un retrait ça sera la seconde.

    Où placer ces fonctions ? : c’est à vous de voir. Généralement, la seconde est à utiliser quand on a plus besoin de la machine dans le groupe par exemple ou on veut droper l’ensemble des machines du groupe pour fermer l’application par la suite un peu comme un free après un malloc.

    à bientôt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/06/2016, 13h39
  2. Sql_config failed error =21. this should never Occur
    Par Minifish57 dans le forum Android
    Réponses: 0
    Dernier message: 16/05/2013, 16h55
  3. [AC-2003] Access 2003 ODBC Call Failed error
    Par Skullish dans le forum VBA Access
    Réponses: 11
    Dernier message: 06/06/2012, 13h16
  4. Error:Programm Server Socket
    Par LiaGalanodel dans le forum C++
    Réponses: 3
    Dernier message: 30/03/2010, 09h20
  5. Réponses: 2
    Dernier message: 15/09/2009, 08h40

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