Использую netfilter для захвата данных UDP, но у меня много потерь пакетовLinux

Ответить
Гость
 Использую netfilter для захвата данных UDP, но у меня много потерь пакетов

Сообщение Гость »

Я использую сетевой фильтр для захвата UDP-пакета и получения пакета на стороне приложения при обратном вызове. ниже я дал функцию обратного вызова. Я обрабатываю данные в функции обратного вызова, но в основном пакеты пропускаются, но в драйвере все пакеты добавляются в NF_QUEUE

Код: Выделить всё

int device::filter_fn(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg, struct nfq_data *nfa, void *data)
{
int id;

struct nfqnl_msg_packet_hdr *ph;
ph = nfq_get_msg_packet_hdr(nfa);
id = ntohl(ph->packet_id);
printf("filter function id=%d\n",id);

unsigned char *pktData;
int len = nfq_get_payload(nfa, &pktData);

if (len > 36 and IsHeaderDetected == true && cnt < 480){
memcpy(Frame_data + size, pktData + 28, len - 28);
size += len - 28;
cnt++;
}
else if (len == 36 && pktData[28] == 0xaa /*&& pktData[29] == 0x55*/ /*&& pktData[30] == 0xaa && pktData[31] == 0x55*/){
IsHeaderDetected = true;
size = 0;
cnt= 0;
//memset(Frame_data,0, 1920*1080*2);
}
else if (len == 36 && pktData[28] == 0xbb /*&& pktData[29] == 0x66*/ /*&& pktData[30] == 0xbb && pktData[31] == 0x66*/){

if (cnt == 480 && size == 4147200 ){

memcpy(RenderFrame_data, Frame_data, size);

FrameQueue.push((unsigned char *)RenderFrame_data);
memset(Frame_data,0, 1920*1080*2);
currFPS = FPS();
}
IsHeaderDetected = false;
size = 0;
cnt= 0;

}

if ( id % 3 == 0)
return nfq_set_verdict(qh, id, NF_DROP, 0, NULL);

return nfq_set_verdict(qh, id, NF_ACCEPT, 0, NULL);
}
Как избежать потери пакетов?
Я пытался решить эту проблему, реализовав потоки для обработки данных, но после этого у меня возникла та же проблема
п>

Подробнее здесь: https://stackoverflow.com/questions/781 ... acket-loss
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»