这是我的代码。它在编译期间不会出现任何错误。但是当我运行它时,它会给出
从错误中恢复,无法获取数据包
错误。有什么问题?
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;
}
答案 0 :(得分:2)
当你将运行可执行文件时,只需在./executablefilename之前使用sudo命令。 喜欢:$ gcc pack.c -o pack 然后 $ sudo ./pack 那么它会运行正常 谢谢
答案 1 :(得分:0)
如果您只想嗅探所有以太网流量,请使用以下命令:
sock_raw = socket( PF_PACKET, SOCK_RAW, htons(ETH_P_ALL) )
通常,原始套接字仅适用于UNIX或Linux下的root用户。
某些较旧的Windows根本不允许使用原始套接字。
saddr
的类型应为:
struct sockaddr_ll
答案 2 :(得分:0)
我过去遇到过这个问题。要创建RAW套接字,您需要运行具有管理员权限的可执行文件。