如何关闭POSIX函数send()中的TCP PSH标志?

问题描述 投票:7回答:1

我正在使用以太网向步进电机系统发送命令。命令使电机移动,或响应驱动器状态,或配置驱动器等...步进电机系统有时挂起,或无法执行命令,制造商已查看我提供的所有内容告诉我关闭TCP层中的PSH标志。

Wireshark的屏幕截图显示了我的代码使用PSH标志:

enter image description here

我正在使用在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};

发送时看起来像这样:enter image description here

我发送的最大消息是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 */ }
c++ tcp posix send nagle
1个回答
1
投票

使用标准linux TCP stack you don't have direct control over this. PSH标志是否设置是由发送缓冲区控制并在堆栈中复制。使用嵌入式LWIP堆栈,您可以获得更多控制权。

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

© www.soinside.com 2019 - 2024. All rights reserved.