Почему длина сегмента TCP не отличается в одной и той же последовательности TCP при использовании сетевой карты Exanic XC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему длина сегмента TCP не отличается в одной и той же последовательности TCP при использовании сетевой карты Exanic X

Сообщение Anonymous »


Ниже приводится описание моей проблемы. Я использовал один сетевой адаптер Cisco Nexus SmartNIC K35-S (ранее Exanic X10 NIC) для зеркалирования данных TCP и анализа этих пакетов. Процесс получения данных кадра от сетевого адаптера X10 находится в цикле while, и он был помещен в один поток (использовался поток C++ 11). Чтобы ускорить анализ данных, я использовал внутреннюю связь с нулевым процессом для обработки данных буфера кадра X10.

void get_exanic_frame(exanic_t *exanic, exanic_rx_t *exanic_rx) { буфер символов [2048]; exanic_cycles32_t временная метка; exanic_cycles_t timestamp_64; пока (g_running) { sz = exanic_receive_frame (exanic_rx, буфер, sizeof (буфер), & отметка времени); msg_t сообщение; msg.frame.len = static_cast(sz - 4); memcpy(msg.frame.buf, буфер, sz - 4); int rc = zmq_send(zmq_send_sock, &msg, sizeof(msg_t), 0); ТЕСТ (rc == sizeof (msg_t)); } } void zmq_recv_sock_thread() { пока (g_running) { msg_t сообщение; int rc = zmq_recv(zmq_proc_sock, &msg, sizeof(msg_t), ZMQ_DONTWAIT); если (0 > rc) { TEST(EINTR == ошибка || EAGAIN == ошибка); } еще { handle_zmq_recv (мсг); спать(10); } } } void proc_msg_init_zmq() { интервал RC, Вал; zmq_send_sock = zmq_socket(zmq_ctx, ZMQ_PAIR); ТЕСТ (zmq_send_sock); вал = ZMQ_SNDHWM_VAL; rc = zmq_setsockopt(zmq_send_sock, ZMQ_RCVHWM, &val, sizeof(val)); ТЕСТ (0 == RC); вал = ZMQ_RCVHWM_VAL; rc = zmq_setsockopt(zmq_send_sock, ZMQ_SNDHWM, &val, sizeof(val)); ТЕСТ (0 == RC); rc = zmq_bind(zmq_send_sock, ZMQ_INPROC_ADDR); } недействительный Recv_init_zmq() { интервал RC, Вал; zmq_proc_sock = zmq_socket(zmq_ctx, ZMQ_PAIR); ТЕСТ (zmq_proc_sock); вал = ZMQ_RCVHWM_VAL; rc = zmq_setsockopt(zmq_proc_sock, ZMQ_RCVHWM, &val, sizeof(val)); ТЕСТ (0 == RC); вал = ZMQ_SNDHWM_VAL; rc = zmq_setsockopt(zmq_proc_sock, ZMQ_SNDHWM, &val, sizeof(val)); ТЕСТ (0 == RC); rc = zmq_connect(zmq_proc_sock, ZMQ_INPROC_ADDR); ТЕСТ (0 == RC); } следующий код находится в основной функции.

thread md_recv(get_exanic_frame, exanic, exanic_rx); zmq_recv_sock_thread эта функция находится в основном потоке. В то же время запускаю программу и использую команду tcpdump для захвата TCP-пакетов на одном и том же интерфейсе сетевой карты. Наконец, я обнаружил проблему, заключающуюся в том, что до тех пор, пока не будет создана одна TCP-последовательность, длина TCP-сегмента не отличается от файла pcap из tcpdump. .Так что же вызывает эту проблему?

Данные кадра, полученные от Exanic X10 с помощью вызова функции exanic_receive_frame(), должны быть идентичны данным кадра из файлов pcap, сгенерированных командой tcpdumping на том же интерфейсе NIC. Но результат программы не имеет того же размера сегмента TCP в соответствующей последовательности TCP, что и сегмент в файле pcap. Поэтому я хочу найти решение этой проблемы.
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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