關於send arp packet的問題 |
答題得分者是:Ktop_Robot
|
yojin
一般會員 發表:13 回覆:18 積分:6 註冊:2005-06-04 發送簡訊給我 |
想請問各位高手一下,我的程式環境是BCB 6.0,我想寫一個發arp reply的封包,但不知道問題出在那裡,為什麼我怎麼發在win2000的network monitor下發出去的封包總是ip的封包,是不是我的封包結構定義錯了?我在猜想,會不會winsock不行發也不行擷取arp的封包呢?因為之前自己寫程式擷取封包時只能擷取到icmp tcp udp等封包啊,還是如果要做到發arp的封包,一定要使用winpcap呢?麻煩知道的大大提供個意見,謝謝,以下是我的程式碼! #include
#include
#include
#include
#include
#include
#include
#include
#define ARP_TYPE 0x0806;
#define IP_TYPE 0x0800;
#define ETHER_TYPE 1;
#define IP_LENGTH 4;
#define Hardware_LENGTH 6;
#define ARP_REPLY 2;
#pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused
struct ARP_PACKET{
//Ethernet header
unsigned char DstHardwareAddr[6]; //Destination MAC Address
unsigned char SrcHardwareAddr[6]; //Source MAC Address
unsigned short Frame_Type;
//ARP header
unsigned short HardwareType;
unsigned short ProtocolType;
unsigned char HarewareAddrLen;
unsigned char ProtocolAddrLen;
unsigned short Operation;
unsigned char SenderHardwareAddr[6];
unsigned long SenderProtocolAddr;
unsigned char TargetHardwareAddr[6];
unsigned long TargetProtocolAddr;
unsigned char Padding[18];
}arp; int main(int argc, char* argv[])
{
WSAData data1;
ETHERNET ether;
WSAStartup(MAKEWORD(2, 2), &data1);
SOCKET ServerSocket=socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
//BOOL b=TRUE;
//setsockopt(ServerSocket, IPPROTO_RAW, IP_HDRINCL, (char *)&b, sizeof(b));
//
unsigned char SrcHardwareAddr[6]={0, 5, 93, 124, 76, 164}; //192.168.1.2 my nic
unsigned char DstHardwareAddr[6]={0, 4, 35, 142, 49, 215}; //192.168.1.3 nic
arp.SrcHardwareAddr[0]=SrcHardwareAddr[0];
arp.SrcHardwareAddr[1]=SrcHardwareAddr[1];
arp.SrcHardwareAddr[2]=SrcHardwareAddr[2];
arp.SrcHardwareAddr[3]=SrcHardwareAddr[3];
arp.SrcHardwareAddr[4]=SrcHardwareAddr[4];
arp.SrcHardwareAddr[5]=SrcHardwareAddr[5];
arp.DstHardwareAddr[0]=DstHardwareAddr[0];
arp.DstHardwareAddr[1]=DstHardwareAddr[1];
arp.DstHardwareAddr[2]=DstHardwareAddr[2];
arp.DstHardwareAddr[3]=DstHardwareAddr[3];
arp.DstHardwareAddr[4]=DstHardwareAddr[4];
arp.DstHardwareAddr[5]=DstHardwareAddr[5];
arp.Frame_Type=ARP_TYPE;
//
arp.HardwareType=ETHER_TYPE;
arp.ProtocolType=IP_TYPE;
arp.HarewareAddrLen=Hardware_LENGTH;
arp.ProtocolAddrLen=IP_LENGTH;
arp.Operation=ARP_REPLY;
arp.SenderHardwareAddr[0]=SrcHardwareAddr[0];
arp.SenderHardwareAddr[1]=SrcHardwareAddr[1];
arp.SenderHardwareAddr[2]=SrcHardwareAddr[2];
arp.SenderHardwareAddr[3]=SrcHardwareAddr[3];
arp.SenderHardwareAddr[4]=SrcHardwareAddr[4];
arp.SenderHardwareAddr[5]=SrcHardwareAddr[5];
arp.SenderProtocolAddr=inet_addr("192.168.1.2");
arp.TargetHardwareAddr[0]=DstHardwareAddr[0];
arp.TargetHardwareAddr[1]=DstHardwareAddr[1];
arp.TargetHardwareAddr[2]=DstHardwareAddr[2];
arp.TargetHardwareAddr[3]=DstHardwareAddr[3];
arp.TargetHardwareAddr[4]=DstHardwareAddr[4];
arp.TargetHardwareAddr[5]=DstHardwareAddr[5];
arp.TargetProtocolAddr=inet_addr("192.168.1.3");
//
sockaddr_in service;
service.sin_family=AF_INET;
service.sin_port=htons(0);
service.sin_addr.s_addr=inet_addr("192.168.1.3");
//
int count=1;
while(true){
cout << count << ": " << sendto(ServerSocket, (char *)&arp, sizeof(arp), 0, (SOCKADDR *)&service, sizeof(service)) << " bytes send..." << endl;
Sleep(100);
count ;
}
system("pause");
return 0;
}
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |