TcpClient wait for CRLF

本文关键字:CRLF for wait TcpClient | 更新日期: 2023-09-27 18:14:40

我正在编写一个类库,通过使用TCP与PLC通信。通信是基于发送一个由CRLF终止的数据字符串,然后等待一个确认字符串(也由CRLF终止)来确认收到的数据(是的,我知道这也包括在TCPIP协议中,但这是另一个讨论)。

目前我面临两个主要问题:

  1. 我正在设置TcpClient。SendTimeout属性,但是在发送数据时(通过TcpClient.Client.Send),发送方并不等待接收方读取数据。为什么?
  2. 由于发送方没有等待,因此可以发送一个确认字符串并立即发送下一个数据字符串。所以,接收者收到了两个包裹。是否有一种方法可以读取缓冲区,直到第一个CRLF(确认),并在缓冲区中为下一个TcpClient.Client.Read命令留下下一个数据字符串?

提前感谢,div标记

TCP是一个流协议。没有可以编程的数据包。接收方必须能够解码数据,无论它以什么块的形式到达。例如,假设一个字节块。

在这里,似乎接收器可以一直读取,直到找到CRLF。StreamReader可以做到。

发送方不等待接收方读取数据

TCP是异步的。当Send完成时,接收方不一定已经处理了数据。这是不可能在TCP堆栈级别确保的。接收应用程序可能调用了Receive并获取了数据,但它可能没有处理数据。TCP栈不能知道

您必须设计您的协议,使此信息不需要。

我只读取一个字节,直到

这可以工作,但它是非常CPU密集和低效的

TcpClient wait for CRLF