Voici comment j'ai envoyé une requête ARP sur le réseau. 1. Définir les structures pour les protocoles Si vous voulez envoyer des paquets ARP, vous aurez besoin d'une structure qui contiendra la couche de liaison de données (en-tête Ethernet) et la couche réseau (en-tête ARP). En conséquence, si vous voulez envoyer un paquet TCP sur IP, vous aurez besoin d'une structure de données pour l'en-tête Ethernet, l'en-tête IP et l'en-tête TCP.
une fois que vous avez défini les structures, initialiser une instance de la structure avec les valeurs que vous voulez dire si vous voulez que le paquet pour aller à toutes les machines du réseau définissent la valeur MAC de destination de l'en-tête Ethernet ff: ff : ff: ff: ff: ff Si vous souhaitez envoyer le paquet à la machine X avec (adresse IP 192.168.0.88), définissez l'adresse de destination dans la couche ip sur cette valeur. Une fois terminé, vous devrez déclarer un tableau char * et copier toutes les structures dans le tableau char * pour créer une séquence d'octets et l'envoyer sur le réseau.
// Juste pour vous montrer ce que je veux dire en définissant les structures // ne se rapportent au reste du code extrait
typedef struct IP_header
{
u_char VersionNInternetHeaderLength; // Version (4 bits) + Internet header length (4 bits)
/*u_char version:4;
u_char HeaderLength:4;*/
u_char Type; // Type of service
u_short TotalLength; // Total length
u_short Identification; // Identification
u_char rsv : 1;
u_char df : 1;
u_char mf : 1;
u_char FragmentOffset1 : 5;
u_char FragmentOffset2;
//u_short Flags_fo; // Flags (3 bits) + Fragment offset (13 bits)
u_char TimeToLive; // Time to live
u_char Protocol; // Next level Protocol of the encapsulated payload
u_short Checksum; // Header checksum
IP_address SourceAddress; // Source address
IP_address DestinationAddress; // Destination address
u_int OptionNPadding; // Option + Padding
IP_header()
{
mf = 0;
rsv = 0;
df = 0;
FragmentOffset1 = 0;
FragmentOffset2 = 0;
TimeToLive = 128;
TotalLength = sizeof(IP_header);
Identification = 0xABCD;
Checksum = 0xABCD;
OptionNPadding = 0;
}
}IP_header;
Ethernet_header EthernetHeader;// = (Ethernet_header*)malloc(sizeof(Ethernet_header));
ARP_header ARPHeader ;//= (ARP_header*)malloc(sizeof(ARP_header));
ARPHeader.HardwareType = htons(1);
ARPHeader.ProtocolType = htons(0x800);
ARPHeader.OPCODE = htons(1);
ARPHeader.HeaderLength = 6;
ARPHeader.ProtocolLength = 4;
ARPHeader.SenderMAC = MY_FAKE_MAC;
ARPHeader.SenderIP = MY_IP;
ARPHeader.TargetMAC = MAC_address();
ARPHeader.TargetIP = Whose;
EthernetHeader.DestinationMAC = BROADCASTMAC;
EthernetHeader.SourceMAC = MY_FAKE_MAC;
EthernetHeader.EtherType = htons(0x806);
u_char* packet = (u_char*)malloc(sizeof(EthernetHeader) + sizeof(ARPHeader));
memcpy(packet, &EthernetHeader, sizeof(EthernetHeader));
memcpy(packet + sizeof(EthernetHeader), &ARPHeader, sizeof(ARPHeader));
SendPacket(packet);
Ouais, je pensais il y a environ 2 minutes que. Je crée un paquet, y ajoute les informations, puis je l'envoie. Merci quand même! –