Я работаю с библиотекой Winpcap и столкнулся с проблемой производительности.
Когда я звоню
pcap_next_ex(fp, &header, &pkt_data)
Я получаю массив const char * с данными пакета в pkt_data
,
Теперь я хочу изменить какую-то его часть, поэтому я понял это следующим образом:
std::vector<char> send_pkt(pkt_data, pkt_data + header->caplen);
(header-> caplen — длина пакета). Теперь я могу поиграть с ним и отправить его вниз.
Но у меня задержка в сети до 2000 мс, поэтому я профилировал код на VS 2013, и похоже, что эта строка кода потребляет слишком много циклов ЦП. Я полагаю, это потому, что массив пакетов полностью копируется в вектор.
Итак, мой вопрос, что я могу сделать, чтобы изменить оригинал 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 из указателя, а затем изменить данные. Конечно, поступая так, вы будете входить в сферу Неопределенного поведения и тем самым вводить возможность сбоев, неверных результатов, демонов Flying Nose и т. Д. Но компилятор позволит вам это сделать, так что если вы в отчаянии и ничего еще достаточно, вы можете попробовать и посмотреть, что произойдет. Имейте в виду, что даже если кажется, что он работает на вашей машине, это не значит, что он обязательно будет работать на других платформах.
Однако перед тем, как сделать что-нибудь поспешное, я сначала попробую сделать это: навсегда выделить достаточно большой массив символов, memcpy () константную строку в указанный массив и изменить массив так, как вам нужно. memcpy () довольно эффективен, поскольку (в отличие от вашего векторного подхода) он не требует динамического выделения или освобождения памяти из кучи. Посмотри, достаточно ли это быстро для тебя.
А что я могу сделать
Ничего такого. Вы не должны ничего менять за const char*
,
Я полагаю, это потому, что массив пакетов полностью копируется в вектор.
Да, возможно. Если вы хотите изменить данные, вам нужно владеть ими, и в этом случае, если вы не копируете их, вы не являетесь их владельцем.