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