почему мой необработанный сокет не создается? - PullRequest
0 голосов
/ 03 февраля 2012

Это мой код.Это не дает никаких ошибок во время компиляции.Но когда я запускаю его, он выдает

Recv from error, не удалось получить пакеты

error.Что не так?

logfile=fopen("log.txt","w");
if(logfile==NULL) printf("Unable to create file.");
printf("Starting...\n");
//Create a raw socket that shall sniff
sock_raw = socket(AF_INET , SOCK_RAW , IPPROTO_TCP);

if(sock_raw < 0)
{
    printf("Socket Error\n");
    return 1;
}
while(1)
{
    saddr_size = sizeof saddr;
    //Receive a packet
    data_size = recvfrom(sock_raw , buffer , 65536 , 0 , &saddr , &saddr_size);
    if(data_size <0 )
    {
        printf("Recv from error , failed to get packets\n");
        return 1;
    }
    //Now process the packet
    ProcessPacket(buffer , data_size);
}
close(sock_raw);
printf("Finished");
return 0;

}

Ответы [ 3 ]

2 голосов
/ 22 декабря 2014

когда вы запустите исполняемый файл, просто используйте команду sudo перед ./executablefilename. как: $ gcc pack.c -o pack а потом $ sudo ./pack тогда он будет работать нормально спасибо

0 голосов
/ 03 июля 2017

Я сталкивался с этой проблемой в прошлом.чтобы создать сокет RAW, вам нужно запустить исполняемый файл с правами администратора.

0 голосов
/ 03 февраля 2012

Если вы хотите просто прослушать весь трафик Ethernet, используйте следующее:

sock_raw = socket( PF_PACKET, SOCK_RAW, htons(ETH_P_ALL) )

Обычно raw сокеты работают только для пользователя root в UNIX или Linux.

Некоторые старые Windows вообще не допускают необработанных сокетов.

Тип saddr должен быть:

struct sockaddr_ll
...