Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 原始套接字未接收ARP请求_C++_C_Sockets_Packet - Fatal编程技术网

C++ 原始套接字未接收ARP请求

C++ 原始套接字未接收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

我正在尝试编写一个自定义数据包嗅探器。我遵循以下教程

这样做,我无法拾取ARP请求数据包。我成功地获取了所有其他数据包,包括ICMP、IP等

下面是代码的概述。同样,我正在读取所有其他数据包(每个其他数据包的每个字节),但我没有读取任何ARP

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