gpt4 book ai didi

c# - 即使在 Tcpclient.NoDelay = true 之后,socket.send 也会将数据包附加在一起;

转载 作者:可可西里 更新时间:2023-11-01 02:33:49 32 4
gpt4 key购买 nike

这开始让我很沮丧,因为无论我做什么,我的数据包都会被挤在一起,这让另一端不得不区分它们很烦人(对象很容易,可变字符串可能很痛苦)。有没有办法避免这种情况?

这是我正在使用的一些粗略代码(是的,初始化发生在这里,这是粗略的测试代码,很抱歉糟糕的编程约定)

    sender.Connect("localhost", 8523);
sender.Client.SendTimeout = 1000;
sender.NoDelay = true;
byte[] buffer = ASCIIEncoding.ASCII.GetBytes(message);
sender.Client.Send(buffer);
buffer = ASCIIEncoding.ASCII.GetBytes("DISCONNECT");
sender.Client.Send(buffer);
sender.Client.Close();

如您所见,两个发送一个接一个地发生,并且套接字决定最好将它们一起发送。太好了,但我不想要那样。因此在另一端它最终是

   helloDISCONNECT

我需要将两者分开接收,因为它们会自动加载到阻塞队列中,我不想处理对象大小和字符串解析。

最佳答案

TCP 向接收方呈现字节流。

在流关闭之前,每次读取 TCP 套接字都可以返回 1 和您为其提供的缓冲区大小之间的值。您应该相应地编写代码。

TCP 不知道也不关心您的程序的消息框架概念。它不在乎您发送 3 条“消息”并分别调用发送。一个有效的 TCP 实现可以为从流中读取的函数的每次调用返回一个字节,或者它可以在返回字节给您之前尽可能多地缓冲。您应该相应地编写代码。

如果您想在通过 TCP 发送消息时处理消息,那么您必须应用自己的框架,并且在阅读消息时必须自己处理该框架。这通常意味着已知大小的长度前缀或消息终止符。

我会更详细地处理这个问题 here ,虽然代码是用 C++ 编写的,但概念仍然适用。

关于c# - 即使在 Tcpclient.NoDelay = true 之后,socket.send 也会将数据包附加在一起;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10539314/

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