我正在通过TCP连接一个嵌入式电路板到PC。
该板包含一个晶片,遗憾的是,它不会在接收数据时产生任何中断。但它确实会在接收到“保持生命”信号时产生中断。
目前,我不得不调查数据。相反,我认为,我会从PC发送数据,然后发送一个KeepAlive信号。每当收到KeepAlive时,我也会读取数据。我确实理解这可能会产生错误的警报,但它比持续轮询更好。
我在Wireshark上观察到一个保持生命的数据包,它有一个字节的数据,是"00“。

然后,我尝试发送数据为“00”的TCP数据包:

我可以看到,只有Flag部分不同。
我有两个问题:
更新:我尝试过RawSockets,但这对我没有帮助,或者我错过了什么。我只是将原始套接字头中的标志更改为ACK。
发布于 2013-10-01 11:28:49
RFC 1122节4.2.3.6可能值得一读。
它指出,保持活动是TCP实现的一个可选特性。它还规定,保持生命的信号最多应限制在每两小时一次。因此,通常从应用程序中手动发出一个并不是一个理想的特性。
此外,它还描述了实现的细节,特别是指出了所涉及的序列号。这是屏幕截图中明显没有注意到的一个不同之处:真正的保活数据包有一个非常高的相对序列号,这就是-1的无符号表示。要用原始套接字来再现这一点,我认为您必须以某种方式获得现有连接的当前TCP序列号。在RawSockets中还没有足够的工作来了解如何做到这一点的细节。
支持让系统定期发送保持生命的方法是使用SO_KEEPALIVE选项。但我认为,在特定时刻发出这样的信号是没有多大用处的。
https://stackoverflow.com/questions/18889437
复制相似问题