Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.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
C# 当我告诉它不要时,为什么这段代码会缓冲TCP输出?_C#_Http_Tcp - Fatal编程技术网

C# 当我告诉它不要时,为什么这段代码会缓冲TCP输出?

C# 当我告诉它不要时,为什么这段代码会缓冲TCP输出?,c#,http,tcp,C#,Http,Tcp,这是我用来测试嵌入式产品上的Web服务器的代码,当HTTP请求在多个TCP数据包中出现碎片时,该嵌入式产品表现不佳: /* This is all within a loop that cycles size_chunk up to the size of the whole * test request, in order to test all possible fragment sizes. */ TcpClient client_sensor = new TcpClient(NAME

这是我用来测试嵌入式产品上的Web服务器的代码,当HTTP请求在多个TCP数据包中出现碎片时,该嵌入式产品表现不佳:

/* This is all within a loop that cycles size_chunk up to the size of the whole 
 * test request, in order to test all possible fragment sizes. */
TcpClient client_sensor = new TcpClient(NAME_MODULE, 80);    
client_sensor.Client.NoDelay = true;    /* SHOULD force the TCP socket to send the packets in exactly the chunks we tell it to, rather than buffering the output. */
/* I have also tried just "client_sensor.NoDelay = true, with no luck. */
client_sensor.Client.SendBufferSize = size_chunk; /* Added in a desperate attempt to fix the problem before posting my shameful ignorance on stackoverflow. */
for (int j = 0; j < TEST_HEADERS.Length; j += size_chunk)
{
    String request_fragment = TEST_HEADERS.Substring(j, (TEST_HEADERS.Length < j + size_chunk) ? (TEST_HEADERS.Length - j) : size_chunk);
    client_sensor.Client.Send(Encoding.ASCII.GetBytes(request_fragment));     
    client_sensor.GetStream().Flush();   
}
/* Test stuff goes here, check that the embedded web server responded correctly, etc.. */
/*这一切都在一个循环中,循环大小\u块直至整个循环的大小
*测试请求,以测试所有可能的碎片大小*/
TCP客户端\传感器=新的TCP客户端(名称\模块,80);
client_sensor.client.NoDelay=true;/*应该强制TCP套接字按照我们告诉它的块发送数据包,而不是缓冲输出*/
/*我也尝试过“client_sensor.NoDelay=true”,但没有运气*/
client_sensor.client.SendBufferSize=size_chunk;/*是在发布我对stackoverflow的可耻无知之前,为了解决问题而不顾一切地添加的*/
对于(int j=0;j
查看Wireshark,我只看到一个TCP数据包离开,它包含整个测试头,而不是我预期的大约
头长度/块大小的数据包。我以前使用过NoDelay关闭Nagle算法,它通常与我预期的一样工作。
NoDelay
的在线文档ly在其关联的代码示例中声明“在调用NetworkStream.Write时立即发送数据”,因此我认为我一直在正确使用它

无论我是否一步一步地完成代码,这种情况都会发生。NET运行时是否在优化我的数据包碎片


我正在运行x64 Windows 7、.NET Framework 3.5,Visual Studio 2010。

显示设置为TcpClient.NoDelay=true,而不是TcpClient.Client.NoDelay属性。您尝试过了吗?

TcpClient.NoDelay
并不意味着字节块不会聚合到单个数据包中。这意味着字节块不会被删除为了聚合成一个数据包而对其进行加密


如果要强制设置数据包边界,请使用
Stream.Flush

您的测试代码很好(我假设您发送了有效的HTTP)。您应该检查的是,在从TCP连接读取数据时,TCP服务器运行不正常的原因。TCP是一种流协议-这意味着您不能对数据包的大小做出任何假设,除非您在数据协议中明确指定这些大小。例如,您可以使用固定大小(2字节)为所有数据包添加前缀前缀,它将包含要接收的数据的大小

在读取HTTP时,通常读取由几个阶段组成:读取HTTP行、读取HTTP头、读取HTTP内容(如果适用)。前两部分没有任何大小规格,但有特殊的分隔符(CRLF)


是一些有关如何读取和解析HTTP的信息。

Grr。这是我的防病毒软件造成的。最近的一次更新导致它开始干扰向端口80发送HTTP请求,将所有输出缓冲到最后一个“\r\n\r\n“无论操作系统试图如何处理出站TCP流量,都可以看到标记。我应该先检查一下,但是我已经用了很多年同样的防病毒程序,以前从来没有出现过这个问题,所以我甚至没有想到它。当我禁用杀毒软件时,一切都像以前一样正常。

我想知道WireShark是否在数据包上线后将其合并。在这种情况下,它似乎根本不适用,但它显然有一些功能。这似乎不太可能,我可能只是在浪费你的时间,把它作为一种可能性。我建议不要使用贬义词,如“保姆状态”,直到你确定你正确地使用了这个系统。骑着高马的第一条规则是,“确保你的马不仅仅是一头驴子。”@KennetBelenky说,我已经删除了冒犯的文字。不过我只是开个玩笑而已=)@SamSkuce谢谢和NP。我只是稍微刷了一点,因为人们常常不知道有多少成千上万的恼人的样板C++,他们可以避免偶尔的奇怪。也就是说,我已经用我的头撞了.Net很多次了,每次都证明我是那个没有掌握全局的人。没有骰子。我过去也曾成功地用过它。谢谢你!一些想法:您是否确定服务器接收缓冲区在发送时未满(这会导致发送缓冲区被阻塞)?此外-MSDN文档显示读取NoDelay属性以测试它是否成功设置-尝试添加该属性以验证客户端/套接字是否满足请求(不知道为什么不满足)。最后,这里有一个关于这个话题的相关问题:运气不好。TcpClient.GetStream().Flush的文档称这只是“供将来使用”。奇怪的是,当我没有将其嵌入到循环中时,例如,当NoDelay为True时,通过套接字写入两个常量缓冲区,即使在没有代码延迟的连续行上,这也像我在过去预期的那样起作用。谢谢你!是否确定套接字处于同步模式(阻塞=false)?如果套接字处于非阻塞模式,则写操作可能会聚合到单个数据包中。如果套接字仍在刷新前一次写入时发生两次后续写入,则会发生这种情况。TCP是一种流协议,这就是为什么您不能假设可能存在“单个数据包”的原因。如果您先发送4个字节,然后发送6个字节-另一端的对等方可以接收3个字节,在另一次调用后可以接收另外7个字节。@VadymStetsiak,是的,这是您在阅读时应该处理TCP的方式