ben*_*iga 5 c linux pcap libpcap
#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>
#define BUFFER_SIZE 65535
char errbuf[PCAP_ERRBUF_SIZE];
int main(int argc, char **argv)
{
int d;
pcap_if_t *alldevsp;
pcap_t *pkt_handle;
if((pcap_findalldevs(&alldevsp,errbuf))==-1)
{
printf("findalldevices: %s\n",errbuf);
exit(1);
}
printf("Availabel network devices are\n");
pcap_if_t *temp = alldevsp;
while((temp)!=NULL)
{
printf("%s: %s\n",(temp)->name,(temp)->description);
(temp)=(temp)->next;
}
pcap_freealldevs(alldevsp);
pkt_handle = pcap_create("wlan1",errbuf);
if(pkt_handle==NULL)
{
printf("create: %s\n",errbuf);
exit(1);
}
if((pcap_set_rfmon(pkt_handle, 1))!=0)
{
printf("Monitor mode could not be set\n");
exit(1);
}
if((pcap_set_buffer_size(pkt_handle, BUFFER_SIZE))!=0)
{
printf("ERROR\n");
exit(1);
}
if((d=(pcap_activate(pkt_handle)))!=0)
{
if(d==PCAP_ERROR_RFMON_NOTSUP)
printf("%d : PCAP_ERROR_RFMON_NOTSUP\n",d);
if(d==PCAP_WARNING)
printf("%d : PCAP_WARNING\n",d);
if(d==PCAP_ERROR)
printf("%d : PCAP_ERROR\n",d);
pcap_perror(pkt_handle,"Activate");
exit(1);
}
printf("d=%d\n",d);
while(1)
{
scanf("%d",&d);
if(d==-1)
break;
}
pcap_close(pkt_handle);
printf("Bye\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用以下命令运行上述程序时:
gcc -Wall -lpcap sample.c -o sample
我得到以下错误:
-1:PCAP_ERROR
激活:不能mmap rx ring:无效参数
但是,如果我注释掉包含"pcap_set_buffer_size()"函数调用的代码部分,该程序可以正常工作.
那么,pcap_set_buffer_size()有什么问题?
为什么导致"pcap_activate()"失败?
alk*_*alk 12
对于最近的64位Linux:
任何等于或大于65616的缓冲区大小都应该这样做.
对于价值是如何计算的,请参阅执行create_ring()在pcap-linux.c从libpcap源.
默认值为2*1024*1024 = 2097152.
Windows上的默认缓冲区大小为1000000.
更新:
要设置的缓冲区大小是pcap_set_buffer_size()指(ring-)缓冲区,它存储已接收的包.最佳大小取决于用例和经济实惠的系统资源(不可分页的内存).
有关接收缓冲区大小的详细信息请参见以下语句 man pcap:
到达捕获的数据包存储在缓冲区中,因此应用程序一到达就不必读取它们.在某些平台上,可以设置缓冲区的大小; 太小的大小可能意味着,如果捕获太多数据包并且快照长度不限制缓冲的数据量,如果缓冲区在应用程序可以从其中读取数据包之前填满,则可以丢弃数据包,同时太大的大小可能会使用更多不可分页的操作系统内存,而不是防止数据包被丢弃.
更新1:
无论如何,缓冲区的大小应该是为使用中的句柄设置的捕捉长度,加上正确对齐缓冲区本身所需的一些字节,否则激活句柄最终会如原始问题中所述.
可以使用检索手柄的当前捕捉长度pcap_snapshot().默认捕捉长度为65535字节.
| 归档时间: |
|
| 查看次数: |
8070 次 |
| 最近记录: |