我正在使用Winpcap库,我遇到了性能问题。 当我打电话给
pcap_next_ex(fp, &header, &pkt_data)
我得到一个const char *数组,其数据包数据位于pkt_data
。
现在我想修改它的某些部分,所以我想出了这个方法:
std::vector<char> send_pkt(pkt_data, pkt_data + header->caplen);
(header-&gt; caplen是数据包长度)现在我可以使用它,然后将其发送出来。
但是,我的网络延迟时间长达2000毫秒,所以我在VS 2013上分析了代码,看起来这行代码占用了太多的cpu周期。我想这是因为数据包数组完全复制到向量。
所以我的问题是,我该怎么做才能快速修改原始const char *pkt_data
数组?
非常感谢!
编辑:最后解决了问题。 winpcap驱动程序造成了所有麻烦,因为它将mintocopy属性设置得太高(默认为16000),因此在流量较低时,如运行ping,缓冲区未满,并产生延迟。 致电pcap_setmintocopy(fp, 10)
就可以了。
对于数据包(const char *)修改,我使用下面提供的转换解决方案成功,尽管存在修改标记为常量的东西的风险,但是它工作了,现在我完美地完成了目标。
u_char * send_pkt = const_cast<u_char *>(pkt_data);
答案 0 :(得分:2)
我会继续说不可言说的:你可以从指针中抛弃const,然后修改数据。当然,通过这样做,你将进入未定义行为的领域,从而引入崩溃,不正确的结果,飞行鼻子守护进程等的可能性。但编译器将允许你这样做,所以如果你是绝望的,没有什么否则就足够了,你可以尝试一下,看看会发生什么。请记住,即使它似乎适用于您的计算机,但这并不意味着它必然适用于其他平台。
在做任何事情之前,我首先尝试这样做:永久地将一个足够大的char数组,memcpy()const字符串分配到所述数组中,然后根据需要修改数组。 memcpy()非常有效,因为(与向量方法不同)它不需要任何动态分配或从堆中释放内存。看看它是否足够快。
答案 1 :(得分:1)
我能做什么
没什么。你不得修改const char*
背后的任何内容。
我想这是因为数据包数组完全复制到矢量。
是的,可能。如果你想修改数据,你需要拥有它,在这种情况下,除非你复制它,否则你就不拥有它。