我正在使用以太网向步进电机系统发送命令。这些命令可以让电机移动,或者响应驱动器状态,或者配置驱动器等等... 有时候步进电机系统会挂起,或者无法执行命令,制造商检查了我提供的所有内容后告诉我要关闭TCP层中的PSH标志。以下是Wireshark截图,显示了我的代码使用PSH标志的情况:
我正在使用运行在Ubuntu(16.04)上的C++11。
我的发送函数如下所示:
我查看了该函数的说明文档,我理解最后一个参数(我设置为0)是一个标志。但我不明白需要插入哪个值才能关闭PSH标志而不改变其他任何内容(如果可能的话)。你能帮忙吗? 编辑 消息的大小非常小,例如:
我发送的最大消息是8个字符,相当于8字节。
我的发送函数如下所示:
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](https://istack.dev59.com/MZehJ.webp)
编辑 我实现了这个答案(如何在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 */ }
PSH
标志如何会引起问题——如果电机系统收到完整的命令包,则PSH
标志似乎无关紧要。在这种情况下,很有可能这只是制造商的责任推卸。如果电机系统不能处理不完整的数据包,那么它本来也不是很好。毕竟,TCP连接是流。 - Andrew HenlePSH
标志,电机控制器都会表现出来。一个电机控制器应该如何处理传入的数据包?坐在上面等待另一个吗?PSH
标志应该是无关紧要的。制造商的回答有点可疑。这只是纯粹的猜测,但我从你的Wireshark转储中猜测,控制器无法处理你发送给它的每毫秒2-3个数据包,而“关闭PSH
标志!”是制造商试图降低数据包速率的尝试。 - Andrew Henle