Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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
在线程中使用时,recvfrom()为原始套接字返回-1?_C_Multithreading_Sockets - Fatal编程技术网

在线程中使用时,recvfrom()为原始套接字返回-1?

在线程中使用时,recvfrom()为原始套接字返回-1?,c,multithreading,sockets,C,Multithreading,Sockets,我想使用多线程来捕获和处理IP数据包。一个线程只捕获和存储数据包2秒钟,然后使用管道将数据块发送到另一个线程,在那里提取必要的信息。为了捕获ip数据包,am使用原始套接字和recvfrom,但是对于每个循环迭代,recvfrom返回-1。我想socket没有捕获数据包,但我找不到原因…有什么帮助吗??这是代码 void Capture() { int rbytes, Rsock; struct sockaddr saddr; unsigned char *buffer

我想使用多线程来捕获和处理IP数据包。一个线程只捕获和存储数据包2秒钟,然后使用管道将数据块发送到另一个线程,在那里提取必要的信息。为了捕获ip数据包,am使用原始套接字和recvfrom,但是对于每个循环迭代,recvfrom返回-1。我想socket没有捕获数据包,但我找不到原因…有什么帮助吗??这是代码

void Capture()
{
    int rbytes, Rsock;

    struct sockaddr saddr;

    unsigned char *buffer = (unsigned char *)malloc(65536); /* hold packet */

    /* Create a raw socket that shall sniff */
    Rsock=socket(AF_PACKET , SOCK_RAW , htons(ETH_P_IP));
    if(Rsock < 0)
    {
        printf("Socket Error\n");
        return;
    }

    while(1)
    {   
        rbytes = recvfrom (Rsock , buffer , 65536 , 0 , &saddr ,(socklen_t *)sizeof saddr);
        if(rbytes <=0 )
            printf("failed to get packets!");
        else
            printf("Recv bytes %d: \n", rbytes);
    } 
}

你最后的两个论点是错误的

rbytes = recvfrom (Rsock , buffer , 65536 , 0 , &saddr ,(socklen_t *)sizeof saddr);
不要强制转换最后一个参数,您需要在实际指针中转换过去。您还需要传入指向特定sockaddr类型的指针,而不是指向struct sockaddr的指针以及可能需要强制转换的参数

struct sockaddr_storage saddr; //Or sockaddr_in if you are certain you
                               // only deal with IPv4...
socklen_t slen = sizeof saddr;

rbytes = recvfrom (Rsock , buffer , 65536 , 0 , (struct sockaddr*)&saddr ,&slen);
如果recvfrom返回-1,您可以检查errno值以了解错误,或者只打印错误,例如perrorrecvfrom failed

你为什么不检查一下哪里出了问题?
struct sockaddr_storage saddr; //Or sockaddr_in if you are certain you
                               // only deal with IPv4...
socklen_t slen = sizeof saddr;

rbytes = recvfrom (Rsock , buffer , 65536 , 0 , (struct sockaddr*)&saddr ,&slen);