C++ 原始套接字未接收ARP请求
我正在尝试编写一个自定义数据包嗅探器。我遵循以下教程 这样做,我无法拾取ARP请求数据包。我成功地获取了所有其他数据包,包括ICMP、IP等 下面是代码的概述。同样,我正在读取所有其他数据包(每个其他数据包的每个字节),但我没有读取任何ARPC++ 原始套接字未接收ARP请求,c++,c,sockets,packet,C++,C,Sockets,Packet,我正在尝试编写一个自定义数据包嗅探器。我遵循以下教程 这样做,我无法拾取ARP请求数据包。我成功地获取了所有其他数据包,包括ICMP、IP等 下面是代码的概述。同样,我正在读取所有其他数据包(每个其他数据包的每个字节),但我没有读取任何ARP int main() { int saddr_size , data_size; struct sockaddr saddr; unsigned char *buffer = (unsigned char *) malloc(6
int main()
{
int saddr_size , data_size;
struct sockaddr saddr;
unsigned char *buffer = (unsigned char *) malloc(65536); //Its Big!
if(logfile==NULL)
{
printf("Unable to create log.txt file.");
}
printf("Starting...\n");
int sock_raw = socket( AF_PACKET , SOCK_RAW , htons(ETH_P_ALL)) ;
setsockopt(sock_raw , SOL_SOCKET , SO_BINDTODEVICE , "eth0" , strlen("eth0")+ 1 );
if(sock_raw < 0)
{
perror("Socket Error");
return 1;
}
while(1)
{
saddr_size = sizeof saddr;
//Receive a packet
data_size = recvfrom(sock_raw , buffer , 65536 , 0 , &saddr , (socklen_t*)&saddr_size);
if(data_size <0 )
{
printf("Recvfrom error , failed to get packets\n");
return 1;
}
//Now process the packet
ProcessPacket(buffer , data_size);
}
close(sock_raw);
printf("Finished");
return 0;
}
intmain()
{
int saddr_大小、数据大小;
结构sockaddr saddr;
unsigned char*buffer=(unsigned char*)malloc(65536);//太大了!
如果(日志文件==NULL)
{
printf(“无法创建log.txt文件”);
}
printf(“开始…\n”);
int sock_raw=套接字(AF_数据包、sock_raw、htons(ETH_P_ALL));
setsockopt(原始插座、SOL插座、SO绑定到设备,“eth0”,strlen(“eth0”)+1);
如果(短袜未加工<0)
{
perror(“套接字错误”);
返回1;
}
而(1)
{
saddr_尺寸=saddr的尺寸;
//收到一个包
数据大小=recvfrom(存储原始数据、缓冲区、65536、0和saddr,(存储大小*)和saddr大小);
如果(数据大小As不使用IP数据包,则不能使用recvfrom
,必须使用recv
请参见,例如:谢谢!当我学习该教程时,我突然停止接收ICMP数据包…因此我尝试了一种混合方法,它似乎可以工作,即保留PF_数据包而不是AF_数据包,但仍然使用recvfrom而不是recv