模拟保持活动信号

时间:2013-09-19 08:13:00

标签: c++ sockets tcp

我正致力于通过TCP将嵌入式电路板连接到PC。

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

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

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

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

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

我有两个问题:

  1. (概括地说)如何手动发送保持活动信号?
  2. 如何更改该标志设置? (sendsendto中的标志不同)
  3. 更新:    我尝试过RawSockets,但这对我没有帮助,或者我错过了一些东西。我只是在RAW套接字头中将Flag更改为ACK。

1 个答案:

答案 0 :(得分:3)

RFC 1122 section 4.2.3.6可能值得一读。

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

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

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