更新 似乎这个问题不像我想的那样与 Indy 密切相关,更多的是关于多线程的主题。我不会 100% 相信这个问题。
我有一个工作应用程序,它使用 Indy TCP 客户端与通信伙伴交换 ascii 字符串。 通信流程如下所示:
- [Indy Level] Sender 发送字符串
- [TCP 级别] Wireshark 告知此数据包已交付给接收者
- [TCP Level] 接收方发送一个TCP ACK来确认这个数据包
- [Indy关卡] recipient的IOHandler.ReadLn方法返回数据
- [Indy Level] 通过 writeLn() 向原始发送者发送逻辑确认
最近我注意到在那个通信中有一个小问题,在摆弄了 wireshark 之后我得到了以下图片:
- [Indy Level] Sender 发送字符串
- [TCP 级别] Wireshark 告知此数据包已交付给接收者
- [TCP Level] 接收方发送一个TCP ACK来确认这个数据包
- [Indy Level] 接收者的IOHandler.ReadLn方法不返回任何数据
- 无事可做,因为收件人没有可用的数据
超时后,发件人再次发送原始消息,因为没有来自收件人的逻辑确认。
所以我的问题是:如果 wireshark 告诉我底层的 TCP 机制完成了它们的工作,Indy 客户端怎么可能没有可用数据?
问候, 附件
最佳答案
[已解决]
雷米提供的提示是正确的。
我在其读取线程之外调用 TCP 客户端的 Connected
,这弄乱了输入缓冲区并导致未出现消息症状。
删除那个(不必要的)检查解决了这个问题。
关于sockets - 未收到 Indy TCP 客户端数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38696651/