C# 强制TCP流发送缓冲区内容
我使用Csharp tcp套接字在客户端和服务器之间发送数据。 现在的问题是,在我看来,或者在我看来,tcp是一种流协议,除非数据量足够大,否则不会推送(发送)数据C# 强制TCP流发送缓冲区内容,c#,sockets,tcp,client,C#,Sockets,Tcp,Client,我使用Csharp tcp套接字在客户端和服务器之间发送数据。 现在的问题是,在我看来,或者在我看来,tcp是一种流协议,除非数据量足够大,否则不会推送(发送)数据 比如说,我想发送一些数据,不管它是什么都没关系,就说它有8个字节长。我看到的行为是,无论我等待多长时间,它都不会发送数据,除非我在到达tcp缓冲区之前推送更多数据 所以我的问题是。如果我想通过tcp发送少量数据,我需要在末尾附加垃圾以强制套接字发送。(我对此感觉不太好)或者他们是我可以强迫流的前端发送的另一种方式 提前谢谢。我仍在学
比如说,我想发送一些数据,不管它是什么都没关系,就说它有8个字节长。我看到的行为是,无论我等待多长时间,它都不会发送数据,除非我在到达tcp缓冲区之前推送更多数据 所以我的问题是。如果我想通过tcp发送少量数据,我需要在末尾附加垃圾以强制套接字发送。(我对此感觉不太好)或者他们是我可以强迫流的前端发送的另一种方式
提前谢谢。我仍在学习tcp,请原谅我的无知。您可以设置
节点延迟
属性(我认为这是禁用的属性)。除非您是tcp/IP方面的专家并且了解其全部后果,否则不要设置节点延迟。如果你没有读过史蒂文斯的书,那就别想了
下面是一个示例问题:如果建立套接字连接并在其上发送8个字节,是立即发送8个字节,还是Nagle算法等待更多数据发送?答案是“立即发送8字节”-但不要考虑弄乱Nagle,直到你完全明白为什么这是答案。
还有一个问题:在标准的命令/响应协议中,每个数据包应用了多少Nagle延迟?答案是:没有。同样,您应该研究为什么Nagle在这种常见场景中不会导致延迟
如果在250毫秒(最糟糕的情况下是Nagle造成的最大延迟)之前没有看到发送的数据,那么还有其他问题。在.Net中有几种使用套接字发送数据的方法。您使用的是哪一个,即,您能给我们看一下您代码的简短摘录吗?哦,是的,我正在使用TcpClient对象,在客户端和服务器上设置NoDelay=true并不能解决问题。我认为这与不获取数据无关,而与我不使用NetworkStream有关。请正确阅读。我将进一步研究api文档。感谢所有的帮助。“我看到的行为是,无论我等待多长时间,它都不会发送数据,除非我在后面推更多的数据,大概直到我到达tcp缓冲区。”我发现这一部分非常令人惊讶。它最终应该发送小数据,只是等待一点,看看是否有新的数据到达。显示一些代码(客户端和服务器的代码),听起来像是在将流包装到其他缓冲流中,使用TCP发送8字节没有问题,一旦将数据下推到TCP,它不应该“永远”等待,通常只有一小部分时间。