이것은 전선을 통해 ARP 요청을 보낸 방법입니다. 1. 프로토콜 구조를 정의하십시오. 즉, ARP 패킷을 보내려는 경우 데이터 링크 계층 (이더넷 헤더)과 네트워크 계층 (ARP 헤더)이 포함될 구조가 필요합니다. 따라서 IP를 통해 tcp 패킷을 보내려면 이더넷 헤더, ip 헤더 및 tcp 헤더에 대한 데이터 구조가 필요합니다.
당신이 구조를 정의한 후에는 패킷이 FF에 이더넷 헤더의 목적지 맥 값을 설정 네트워크에있는 모든 컴퓨터로 이동하려는 경우, 당신은 즉, 원하는 값으로 구조의 인스턴스를 초기화 : FF : ff : ff : ff : ff (IP 주소가 192.168.0.88 인 컴퓨터 X로 패킷을 보내려면 ip 계층의 대상 주소를 해당 값으로 설정하십시오.
일단 완료되면 char * 배열을 선언하고 모든 구조체를 char * 배열에 복사하여 바이트 시퀀스를 만들고 와이어를 통해 보내야합니다.
// 그냥 내가
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);
그래, 2 분 전 나는 그것에 대해 생각 코드의 나머지 부분에 관련되지 // 않습니다 정의 구조에 의해 무슨 뜻인지를 표시합니다. 나는 패킷을 만들고, 거기에 정보를 설정하고, 그냥 보낸다. 어쨌든 고마워! –