gpt4 book ai didi

c - 如何使用 winpcap 分配内存以发送高性能的大型 pcap 文件(大小大于可用内存)?

转载 作者:太空宇宙 更新时间:2023-11-04 04:04:20 32 4
gpt4 key购买 nike

我使用了 winpcap 示例中的代码来发送 pcap 文件(来自 winpcap 文档的原始代码位于 this link )

发送小的 pcap 文件工作正常,但如果我尝试发送大的 pcap 文件(大于可用内存大小,比如 2 Gb),它肯定会失败。此代码用于在内存中分配文件大小,以便稍后发送

caplen= ftell(capfile)- sizeof(struct pcap_file_header);
...
/* Allocate a send queue */
squeue = pcap_sendqueue_alloc(caplen);

问题是如何使它适用于大文件(以 Gb 为单位或大于可分配的最大内存空间)?例如,我是否应该只分配 100 Mb 并发送队列,然后再占用下一个 100 Mb?如果是,正确的缓冲区大小是多少?以及如何做到这一点?

这里的一个重要问题是发送此文件的性能,需要尽可能快地完成(我正在发送视频数据包)。

简而言之如何管理这里的内存来达到这个目的?

谁有合适的解决方案或建议?


示例代码片段(此问题的不必要代码替换为 ...)

...
#include <pcap.h>
#include <remote-ext.h>

...

void main(int argc, char **argv)
{
pcap_t *indesc,*outdesc;
...
FILE *capfile;
int caplen, sync;
...
pcap_send_queue *squeue;
struct pcap_pkthdr *pktheader;
u_char *pktdata;
...

/* Retrieve the length of the capture file */
capfile=fopen(argv[1],"rb");
if(!capfile){
printf("Capture file not found!\n");
return;
}

fseek(capfile , 0, SEEK_END);
caplen= ftell(capfile)- sizeof(struct pcap_file_header);
fclose(capfile);

...

...

/* Open the capture file */
if ( (indesc= pcap_open(source, 65536, PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL, errbuf) ) == NULL)
{
fprintf(stderr,"\nUnable to open the file %s.\n", source);
return;
}

/* Open the output adapter */
if ( (outdesc= pcap_open(argv[2], 100, PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL, errbuf) ) == NULL)
{
fprintf(stderr,"\nUnable to open adapter %s.\n", source);
return;
}

...

/* Allocate a send queue */
squeue = pcap_sendqueue_alloc(caplen);

/* Fill the queue with the packets from the file */
while ((res = pcap_next_ex( indesc, &pktheader, &pktdata)) == 1)
{
if (pcap_sendqueue_queue(squeue, pktheader, pktdata) == -1)
{
printf("Warning: packet buffer too small, not all the packets will be sent.\n");
break;
}

npacks++;
}

if (res == -1)
{
printf("Corrupted input file.\n");
pcap_sendqueue_destroy(squeue);
return;
}

/* Transmit the queue */



if ((res = pcap_sendqueue_transmit(outdesc, squeue, sync)) < squeue->len)
{
printf("An error occurred sending the packets: %s. Only %d bytes were sent\n", pcap_geterr(outdesc), res);
}


/* free the send queue */
pcap_sendqueue_destroy(squeue);

/* Close the input file */
pcap_close(indesc);

/*
* lose the output adapter
* IMPORTANT: remember to close the adapter, otherwise there will be no guarantee that all the
* packets will be sent!
*/
pcap_close(outdesc);


return;
}

最佳答案

只需将它限制在 50 MB(这有点武断,但我认为起点是合理的),并增强当不是所有数据包都适合队列时发出警告的代码位,以便它只发送它有的东西far 并开始用剩余的数据包从头开始填充队列。

关于c - 如何使用 winpcap 分配内存以发送高性能的大型 pcap 文件(大小大于可用内存)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7944790/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com