gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:31:26 25 4
gpt4 key购买 nike

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

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

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 */ }

最佳答案

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

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

关于c++ - 如何关闭 POSIX 函数 send() 中的 TCP PSH 标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55403681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com