gpt4 book ai didi

c# - TcpClient 等待 CRLF

转载 作者:太空宇宙 更新时间:2023-11-03 15:33:31 27 4
gpt4 key购买 nike

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

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

  1. 我正在设置 TcpClient.SendTimeout 属性,但看起来在发送数据时(通过 TcpClient.Client.Send),发送方不会等待接收方读取数据。为什么?
  2. 因为发送方没有等待,一个确认字符串和下一个数据字符串可以立即发送。因此,接收方收到两个包裹。有没有办法只读取缓冲区直到第一个 CRLF(确认)并将下一个数据字符串留在缓冲区中以供下一个 TcpClient.Client.Read 命令使用。?

提前致谢,标记

最佳答案

TCP 是一种流式传输协议(protocol)。没有您可以针对其编程的数据包。接收方必须能够解码数据,无论它到达的是什么 block 。例如,假设一个字节 block 。

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

the sender does not wait for the receiver the data to be read

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

您必须设计您的协议(protocol),以便不需要此信息。

I just read one byte till

这可行,但会占用大量 CPU 且效率低下。

关于c# - TcpClient 等待 CRLF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32779548/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com