gpt4 book ai didi

c++ - 模拟 Keep Alive 信号

转载 作者:可可西里 更新时间:2023-11-01 02:34:00 30 4
gpt4 key购买 nike

我正在研究通过 TCP 将嵌入式电路板连接到 PC。

该板包含一个 chip遗憾的是,它不会在接收数据时产生任何中断。但它确实会在接收到“Keep-Alive”信号时产生中断。

目前我必须轮询数据。相反,我在想,我将从 PC 发送数据,然后发送 KeepAlive 信号。每当收到 KeepAlive 时,我也会读取数据。我知道这可能会产生错误警报,但它比连续轮询要好。

我在 Wireshark 上观察到一个 Keep-Alive 数据包,它有一个字节的数据并且是“00”。 Keep Alive Signal on Wireshark

然后我尝试发送数据为“00”的 TCP 数据包: Simulated Keep Alive Signal

我可以看到,只有 Flag 部分不同。

我有两个问题:

  1. (大致)如何手动发送 Keep-Alive 信号?
  2. 如何更改该标志设置? (sendsendto 中的标志不同)

更新: 我已经尝试过 RawSockets,但这对我没有帮助,或者我错过了一些东西。我只是在 RAW Sockets header 中将 Flag 更改为 ACK。

最佳答案

RFC 1122 section 4.2.3.6可能值得一读。

它声明保持事件是 TCP 实现的可选功能。它还指出,keepalive 信号应限制为最多每两小时一个。因此,从您的应用程序中手动发出一个通常不是所需的功能。

此外,它还描述了有关实现的细节,特别是指出了涉及的序列号。这是您的屏幕截图中可见的一个差异,您显然没有注意到:真正的保活数据包有一个非常高的相对序列号,它只是 -1 的无符号表示。要使用原始套接字重现这一点,我认为您必须以某种方式获得现有连接的当前 TCP 序列号。还没有充分使用 RawSockets 来了解如何执行此操作的详细信息。

让系统定期发送 keepalive 的支持方法是使用 SO_KEEPALIVE 选项。但我认为,在特定时间及时发出这样的信号不会有多大用处。

关于c++ - 模拟 Keep Alive 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18889437/

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