为什么我的原始套接字没有被创建?

时间:2012-02-03 04:09:28

标签: c networking network-programming network-protocols

这是我的代码。它在编译期间不会出现任何错误。但是当我运行它时,它会给出

  

从错误中恢复,无法获取数据包

错误。有什么问题?

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 个答案:

答案 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套接字,您需要运行具有管理员权限的可执行文件。