gpt4 book ai didi

.net - 从套接字接收的流是否仅限于单个发送命令?

转载 作者:行者123 更新时间:2023-12-03 11:50:54 25 4
gpt4 key购买 nike

我目前在一个多线程应用程序上工作,我使用以下(简化)代码接收数据:

private void BeginReceiveCallback(IAsyncResult ar)
{
bytesReceived = this.Socket.EndReceive(ar);
byte[] receivedData = new byte[bytesReceived];
Array.Copy(buffer, receivedData, bytesReceived);

long protocolLength = BitConverter.ToInt64(receivedData, 0);
string protocol = Encoding.ASCII.GetString(receivedData, 8, (int)protocolLength);
IList<object> sentObjects =
ParseObjectsFromNetworkStream(receivedData, 8 + protocolLength);

InvokeDataReceived(protocol, sentObjects);
}

我正在经历 receivedData不仅包含预期的数据,还包含更多。我怀疑这是后来发送的数据,它与流中的前一个数据混合在一起。

我的问题是,我可以期望将哪些数据存储在此缓冲区中。它可以包含来自客户端的两个不同发送操作的数据吗?在这种情况下,我想我必须想出一个协议(protocol)来区分从客户端发送的数据“消息”。一种简单的方法是分别以特定(唯一)字节开始和结束每个流。有没有一种通用的方法来分隔消息?此外,我猜这意味着单个接收调用可能不足以从客户端获取所有数据,这意味着我必须循环直到找到结束字节?

最佳答案

TCP/IP 套接字连接由两个独立的流组成:一个传入和一个传出。

这是经常被忽略的 TCP/IP 的关键概念之一。从应用程序的角度来看,TCP/IP 不对数据包进行操作;它在流上运行!

没有发送数据包的方法。 API 根本不存在。当您发送数据时,您只需将这些字节放在传出流中。然后从另一端的传入流中读取它们。

例如,一侧可以发送 5 个字节,然后再发送另外 5 个字节。接收端可以接收两批5个字节,或者一次一个,或者一次读取全部10个......

要将传入的字节流拆分为消息,您需要消息框架。通常使用两种解决方案之一。您建议的是 分隔符 解决方案,其中 SOT/EOT 字节用于指定消息边界。另一个(我更喜欢)是 长度前缀 解决方案,其中消息的长度作为消息本身的前缀。

更彻底的讨论是on my blog ,以及 sample code for length prefixing .

关于.net - 从套接字接收的流是否仅限于单个发送命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3252039/

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