我正致力于通过TCP将嵌入式电路板连接到PC。
该板包含一个chip,遗憾的是,它不会在接收数据时产生任何中断。但它确实在接收“保持活动”信号时产生中断。
目前我必须轮询数据。 相反,我在想,我将从PC发送数据,然后发送KeepAlive信号。每当收到KeepAlive时,我也会读取数据。 我知道这可能会产生误报,但它比连续轮询更好。
我在Wireshark上观察到一个Keep-Alive数据包,它有一个字节的数据,它是“00”。
然后我尝试将带有数据的TCP数据包发送为“00”:
我可以看到,只有Flag
部分不同。
我有两个问题:
答案 0 :(得分:3)
RFC 1122 section 4.2.3.6可能值得一读。
它声明keepalive是TCP实现的可选功能。它还指出,保持活动信号应限制在每两个小时最多一次。因此,从应用程序中手动发出一个通常不是理想的功能。
此外,它描述了有关实现的详细信息,特别是指出了所涉及的序列号。这是您在屏幕截图中可见的一个差异,您显然没有注意到:真正的keepalive数据包有一个非常高的相对序列号,它只是-1的无符号表示。要使用原始套接字重现这一点,我认为您必须以某种方式获取现有连接的当前TCP序列号。没有使用RawSockets来了解如何执行此操作的详细信息。
让系统定期发送Keepalive的支持方法是使用SO_KEEPALIVE
选项。但我认为,在特定时刻发出这样的信号并没有多大用处。