我正在使用以太网将命令发送到步进电机系统。这些命令使电动机运动,或响应驱动器状态,或配置驱动器等。...步进电动机系统有时会挂起或无法执行该命令,而制造商查看了我提供的所有信息后,告诉我在TCP层中关闭PSH标志。

Wireshark的屏幕快照显示了我的代码对PSH标志的使用:

c++ - 如何在POSIX函数send()中关闭TCP PSH标志?-LMLPHP

我正在使用在Ubuntu(16.04)中运行的C++ 11。

我的发送函数如下所示:

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

我查看了the writeup的函数,并且我知道最后一个参数(我的值为0)是一个标志。我不了解的是我需要插入以关闭PSH标志而不更改其他任何值的值(如果可能的话)。你能帮我吗?

编辑
消息的大小很小。例如:const char m_ME[5] = {m_HEADER_ONE, m_HEADER_TWO, m_M_HEX, m_E_HEX, m_FOOTER_HEX};
发送时如下所示:
c++ - 如何在POSIX函数send()中关闭TCP PSH标志?-LMLPHP

我发送的最大消息是8个字符,可以计算为8个字节。

编辑
我实现了这个答案(How would one disable Nagle's algorithm in 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 */ }

最佳答案

使用标准linux TCP stack you don't have direct control over this.是否设置PSH标志由发送缓冲区和堆栈中的副本控制。使用嵌入式LWIP堆栈之类的东西,您可以进行更多控制。

但是,尝试将setsockopt(SO_SNDBUF)设置为一个很小的值,看看是否有区别。小于您的数据包大小,即几个字节缓冲区大小设置不起作用,因为操作系统强制执行大于帧的最小大小。

08-27 21:35
查看更多