So habe ich eine ARP-Anfrage über die Leitung gesendet. 1. Definieren Sie Strukturen für die Protokolle. Wenn Sie ARP-Pakete senden möchten, benötigen Sie eine Struktur, die die Sicherungsschicht (Ethernet-Header) und die Netzwerkschicht (ARP-Header) enthält. Entsprechend, wenn Sie ein TCP-Paket über IP senden möchten, benötigen Sie eine Datenstruktur für den Ethernet-Header, IP-Header und TCP-Header.
, wenn Sie die Strukturen definiert, eine Instanz der Struktur mit Werten initialisieren Sie also wollen, wenn Sie das Paket an alle Maschinen gehen wollen in dem Netzwerk des Ziel-MAC-Wert der Ethernet-Header ff: ff : ff: ff: ff: ff Wenn Sie das Paket mit (IP-Adresse 192.168.0.88) an Rechner X senden wollen, dann setzen Sie die Zieladresse in der IP-Ebene auf diesen Wert.
Sobald Sie fertig sind, müssen Sie ein char * -Array deklarieren und alle Strukturen in das char * -Array kopieren, um eine Byte-Sequenz zu erstellen und über die Leitung zu senden.
// Nur um Sie zu zeigen, was ich durch die Definition von Strukturen bedeuten // nicht für den Rest der Code-Snippets bezieht
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);
Ja, 2 Minuten vor mir darüber nachgedacht. Ich erstelle ein Paket, stelle die Informationen dort ein und sende es dann einfach. Danke trotzdem! –