我正在使用 Winpcap 库,但遇到性能问题。 当我调用
pcap_next_ex(fp, &header, &pkt_data)
我在 pkt_data
处获得了一个 const char* 数组,其中包含数据包数据。
现在我想修改它的某些部分,所以我想出了这样的方法:
std::vector<char> send_pkt(pkt_data, pkt_data + header->caplen);
(header->caplen 是数据包长度)现在我可以使用它,并将其发送下来。
但是,我的网络延迟高达 2000 毫秒,因此我在 VS 2013 上分析了代码,看起来这行代码占用了太多的 cpu 周期。我想这是因为数据包数组被完全复制到 vector 中。
所以我的问题是,如何快速修改原始 const char *pkt_data
数组?
非常感谢!
编辑:终于解决了问题。 winpcap 驱动程序造成了所有麻烦,因为它的 mintocopy 属性设置得太高(默认为 16000),因此在流量较低时(例如运行 ping),缓冲区未满,并产生延迟。
调用 pcap_setmintocopy(fp, 10)
就成功了。
对于数据包(const char *)修改,我成功地使用了下面提供的转换解决方案,尽管存在修改标记为常量的内容的风险,但它有效,现在我完美地实现了目标。
u_char * send_pkt = const_cast<u_char *>(pkt_data);
最佳答案
我会继续讲难以言表的事情:您可以从指针中丢弃 const,然后修改数据。当然,这样做你将进入未定义行为的领域,从而引入崩溃、错误结果、飞鼻守护进程等的可能性。但是编译器将允许你这样做,所以如果你绝望而无能为力else 就足够了,你可以尝试一下,看看会发生什么。请记住,即使它看起来可以在您的计算机上运行,但这并不意味着它一定可以在其他平台上运行。
不过,在做任何鲁莽的事情之前,我首先尝试一下:永久分配一个足够大的 char 数组,memcpy() 将 const 字符串放入该数组中,然后根据需要修改该数组。 memcpy() 非常高效,因为(与 vector 方法不同)它不需要任何动态分配或从堆中释放内存。看看这对您来说是否足够快。关于c++ - 修改 const char* 数组的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20943053/