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); |
Partager