Soit tu crées une socket pour TCP (SOCK_STREAM) ou UDP (SOCK_DGRAM) et tu laisses le système traité le paquet par sa pile IP, soit tu crées une socket en mode raw (SOCK_RAW) qui attaque le paquet au niveau 2 et tu dois tout faire toi même.
Code :
- #define DEVICENAME "eth0"
- struct ifreq ifr;
- struct sockaddr_ll sock;
- int sockfd, counter;
- strcpy(ifr.ifr_name, DEVICENAME);
- sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
- if(sockfd <= 0) perror("error creating raw socket. Are you root ?\n" );
- if(ioctl(sockfd, SIOCGIFINDEX, &ifr) < 0) perror("error with IOCTL\n" );
- sock.sll_ifindex = ifr.ifr_ifindex;
|
dans ton paquet tu dois t'occuper des entetes de niveau 2 et 3. voir les struct ether_header et iphdr. Tu envois ensuite le paquet sur l'interface que tu as décidé (DEVICENAME).
Vu que tu bypass la pile IP du système tu dois t'assurer que les paquets que tu as crées sont corrects. Tu envois ensuite de cette façon ton paquet :
Code :
- counter = sendto(sockfd, packet, size, 0,
- (struct sockaddr*) &sock, sizeof(struct sockaddr_ll));
|
Tout ça est expliqué dans les man socket et netdevice, avec les #include qui vont bien.