Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NetworkStream.Read delay.Net_.net_Sockets_Tcpclient_Networkstream - Fatal编程技术网

NetworkStream.Read delay.Net

NetworkStream.Read delay.Net,.net,sockets,tcpclient,networkstream,.net,Sockets,Tcpclient,Networkstream,我有一个从TcpClient继承的类。在那个类中,我有一个方法来处理响应。在该方法中,我调用MyBase.GetStream获取NetworkStream并调用Read 这很好,第一次调用读取块的时间过长。我说的太长是指套接字接收了大量数据,但在达到任意限制之前不会读取数据。我可以看到,它使用数据包嗅探器WireShark接收了大量数据 我已经将Receive缓冲区设置为较小的数量,而非常小的数量(比如只有几个字节)则毫无用处。我对传递给read方法的缓冲区字节数组也做了同样的处理,但它仍然会延

我有一个从TcpClient继承的类。在那个类中,我有一个方法来处理响应。在该方法中,我调用MyBase.GetStream获取NetworkStream并调用Read

这很好,第一次调用读取块的时间过长。我说的太长是指套接字接收了大量数据,但在达到任意限制之前不会读取数据。我可以看到,它使用数据包嗅探器WireShark接收了大量数据

我已经将Receive缓冲区设置为较小的数量,而非常小的数量(比如只有几个字节)则毫无用处。我对传递给read方法的缓冲区字节数组也做了同样的处理,但它仍然会延迟

或者换一种说法。我下载600k。下载需要5秒钟(与服务器的连接速度略高于100k/秒,这是有意义的)。初始读取调用需要2-3秒,并告诉我只有256个字节可用(256是接收缓冲区和我读取到的数组的大小)。然后,神奇的是,其他几十万字节可以在256字节的块中读取,每个块只需几个进程标记。使用数据包嗅探器,我知道在最初的2-3秒内,套接字接收的数据量远远超过256字节。我的连接不是.25k/秒持续3秒,然后400k/秒持续2秒


如何在字节进入时从套接字获取字节?

我以前也遇到过这种情况,这似乎与检查计算机的Internet Explorer设置(代理设置/LAN设置等)有关,这导致了2-3秒的延迟

System.Net命名空间中的类(即WebClient、HttpWebRequest)似乎会在第一次请求时自动执行此操作

您可以尝试关闭或更改IE的代理设置/LAN设置,尤其是自动设置检测选项,这可能会有所帮助

如果这没有帮助,请看这篇文章:。这不完全是TcpClient的问题,但我认为也是同样的问题


希望这能有所帮助。

我在编写开放源码时也遇到过类似的问题。尝试设置:

tcpClient.NoDelay = true;
tcpClient.Client.NoDelay = true;

默认情况下,这将禁用操作。这会在发送和接收非常少量的数据时故意造成各种随机延迟

你的NIC和你的应用程序之间还有什么?禁用防火墙、病毒扫描程序、CRL、代理,看看会发生什么。这是我的防病毒应用程序。它必须缓冲一定量的字节,以便在将其馈送到套接字缓冲区之前扫描它们。这是有道理的,因为我使用的是一个众所周知的端口,它会扫描。我不敢相信我没有想到那一点。你应该把它作为一个答案贴出来,这样我就可以把它标记为好的。这是个好主意。但我在IE和app.config中禁用了检测代理,这并不影响延迟。