Bonjour,

Voici mon problème : j'essaie d'envoyer des trames ethernet depuis un programme en C, mais j'obtiens l'erreur EINVAL (Invalid Argument) lors de l'appel à sendto. Voici (en résumé) le code exécuté :

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
    void* buffer = (void*)malloc(BUFFER_SIZE);
    //memset(buffer, 0, BUFFER_SIZE);
    struct sockaddr_ll saddress;
 
    saddress.sll_family   = PF_PACKET;
    saddress.sll_protocol = htons(ETH_P_ARP);
    saddress.sll_ifindex  = interface; //index de l'interface eth0
    saddress.sll_hatype   = ARPHRD_ETHER;
    saddress.sll_pkttype  = PACKET_OTHERHOST;
    saddress.sll_halen    = ETH_ALEN;
    saddress.sll_addr[0]  = dst_mac[0];
    saddress.sll_addr[1]  = dst_mac[1];
    saddress.sll_addr[2]  = dst_mac[2];
    saddress.sll_addr[3]  = dst_mac[3];
    saddress.sll_addr[4]  = dst_mac[4];
    saddress.sll_addr[5]  = dst_mac[5];
    saddress.sll_addr[6]  = 0x00;
    saddress.sll_addr[7]  = 0x00;
 
    //copie des adresses mac au début de la trame, et insertion des données
    memcpy(buffer,(void*)dst_mac, ETH_MAC_LEN);
    memcpy((buffer+ETH_MAC_LEN),(void*)src_mac, ETH_MAC_LEN);
    unsigned int data_size = min(data.size,1500);
    memcpy((buffer+ETH_HEADER_LEN), data.begin, data_size);
    memset(buffer+(ETH_HEADER_LEN-2),0,2);
 
    /* où data est une structure simple contenant le champ begin (pointeur vers le début des données)
     * et un champ size, qui indique la taille du tableau. Mais peut importe en fait
     */
    //c'est ici que ça ne va pas
    int result = sendto(socket_id, buffer, ETH_HEADER_LEN+data_size, 0,
                        (struct sockaddr*) &saddress, sizeof(saddress));
    free(buffer);
(Je tourne sous debian)

J'obtiens un result de -1, et l'appel à perror() me montre que l'erreur est EINVAL. En regardant la documentation, c'est apparemment dû au fait que le dernier argument de sento (sizeof(saddress)) ne convient pas, mais je ne vois pas en quoi...Tous les exemples de rawsocket que j'ai pu trouvé sur internet utilisaient sendto de la même manière....

Quelqu'un aurait une idée ? Merci d'avance.