我正在使用以太网向步进电机系统发送命令。命令使电机移动,或响应驱动器状态,或配置驱动器等......步进电机系统有时会挂起,或无法执行命令,制造商查看了我提供的所有内容后告诉我关闭 TCP 层中的 PSH 标志。
Wireshark 的屏幕截图显示了我的代码对 PSH 标志的使用:
我正在使用在 Ubuntu (16.04) 中运行的 C++11。
我的发送函数如下所示:
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 个字节。
编辑 我实现了这个答案(如何在 Linux 中禁用 Nagle 的算法?),在我看来 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 */ }