Как отключить флаг TCP PSH в функции POSIX send ()? - PullRequest
7 голосов
/ 28 марта 2019

Я посылаю команды в систему с шаговым двигателем через Ethernet.Команды заставляют двигатель двигаться, или отвечают за состояние привода, или конфигурируют привод и т. Д. Система шагового двигателя иногда зависает или не может выполнить команду, и производитель, просмотрев все, что я поставил, сказал мнеотключите флаг PSH на уровне TCP.

Снимок экрана Wireshark, показывающий использование флага PSH моим кодом:

enter image description here

Я использую C ++ 11, который работает в Ubuntu (16.04).

Моя функция отправки выглядит так:

int sendStatusCode = send(socket , *&pointerToMessageAsCharArray , sizeOfMessage , 0);

Я просмотрел запись для функции, и я понимаю, что последний аргумент (который я имею в 0) является флагом.Что я не понимаю, так это значение, которое мне нужно подключить, чтобы отключить флаг PSH, не меняя ничего другого (если это вообще возможно).Вы можете помочь?

Редактировать Размер сообщений довольно мал.например: const char m_ME[5] = {m_HEADER_ONE, m_HEADER_TWO, m_M_HEX, m_E_HEX, m_FOOTER_HEX};

, который при отправке выглядит следующим образом: enter image description here

Самое большое сообщение, которое я отправляю, составляет 8 символов, которое получается до 8 байтов.

РЕДАКТИРОВАТЬ Я реализовал этот ответ ( Как отключить алгоритм Nagle в Linux? ), и мне кажется, что TCP_NODELAY не отключает флаг PSH.Код, который я использовал для проверки:

int noDelayState = 1; // 0 means prefer bandwidth optimization over low latency

int tcpPushOptionOff = setsockopt(m_socketRight
    , IPPROTO_TCP
    , TCP_NODELAY
    ,(char *) &noDelayState
    , sizeof(int));

if (tcpPushOptionOff < 0) { /* do smth */ }

1 Ответ

1 голос
/ 19 апреля 2019

Со стандартным linux стеком TCP у вас нет прямого контроля над этим. Зависит ли флаг PSH от буфера отправки и копий в стеке. С чем-то вроде встроенного стека LWIP у вас есть немного больше контроля.

Тем не менее, попробуйте установить setsockopt (SO_SNDBUF) на очень маленькое значение и посмотрите, имеет ли это значение. Меньше, чем размер пакета, т. Е. Несколько байтов Настройка размера буфера не работает, поскольку ОС устанавливает минимальный размер, превышающий размер кадра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...