Я посылаю команды в систему с шаговым двигателем через Ethernet.Команды заставляют двигатель двигаться, или отвечают за состояние привода, или конфигурируют привод и т. Д. Система шагового двигателя иногда зависает или не может выполнить команду, и производитель, просмотрев все, что я поставил, сказал мнеотключите флаг PSH на уровне TCP.
Снимок экрана Wireshark, показывающий использование флага PSH моим кодом:
Я использую 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};
, который при отправке выглядит следующим образом:
Самое большое сообщение, которое я отправляю, составляет 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 */ }