Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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# TcpListener在读取所有字节后挂起_C#_.net_Tcp - Fatal编程技术网

C# TcpListener在读取所有字节后挂起

C# TcpListener在读取所有字节后挂起,c#,.net,tcp,C#,.net,Tcp,我试着用TcpListener来听一些数据 我发送此请求(来自Fiddler): GEThttp://localhost:10000/ HTTP/1.1 用户代理:Fiddler 主机:本地主机:10000 听众在这里: 内部静态类程序 { 私有静态void Main(字符串[]args) { const int PORT=10000; var ipAddressParts=新字节[]{127,0,0,1}; var ipAddress=新的ipAddress(ipAddress部件); va

我试着用
TcpListener
来听一些数据

我发送此请求(来自Fiddler):

GEThttp://localhost:10000/ HTTP/1.1
用户代理:Fiddler
主机:本地主机:10000
听众在这里:

内部静态类程序
{
私有静态void Main(字符串[]args)
{
const int PORT=10000;
var ipAddressParts=新字节[]{127,0,0,1};
var ipAddress=新的ipAddress(ipAddress部件);
var服务器=新的TcpListener(IP地址,端口);
const int BUFFER_SIZE=256;
WriteLine($“从{ipAddress}:{PORT}开始”);
server.Start();
while(true)
{
var client=server.AcceptTcpClient();
Console.WriteLine(“接受客户”);
var stream=client.GetStream();
var readCount=默认值(int);
var data=新列表();
做
{
var buffer=新字节[buffer_SIZE];
readCount=stream.Read(buffer,0,buffer.Length);//读取挂起在这里。
WriteLine($“接收到{readCount}字节。”);
如果(读取计数!=0)
{
Console.WriteLine(ASCII.GetString(buffer));
}
数据。添加(缓冲区);
}while(readCount!=0);
var message=ASCII.GetBytes($“{DateTime.Now:D}你好,世界!!!”;
stream.Write(message,0,message.Length);
stream.Close();
}
}
}
侦听器按预期工作,接收并打印消息,输出:

从127.0.0.1:10000开始。
客户接受
收到62个字节。
GET/HTTP/1.1
用户代理:Fiddler
主机:本地主机:10000
但是,它会挂起下一个循环中的下一个读取操作。我知道没有更多的数据要读取,所以我希望读取的字节返回零,然后退出循环

这意味着这是正确的使用方法


我应该使用什么条件来检查读取结束?

在do while循环检查中,使用DataAvailable属性而不是您自己的readCount。文档可在此处找到: 这看起来像:

do{
...

}while(stream.DataAvailable)

在do while循环检查中,使用DataAvailable属性而不是您自己的readCount。文档可在此处找到: 这看起来像:

do{
...

}while(stream.DataAvailable)

如果没有可用数据,Read()调用将等待其他数据。当连接关闭时,它将返回0。由于它没有到达Write()代码,Fiddler正在等待响应。您需要自己检测HTTP请求的结束,以确定何时写入响应。我相信HTTP使用两个连续的换行符(\r\n\r\n)来指示请求中的头的结尾。另外,如果您手动检查\r\n\r\n,请记住它们可能被分割到不同的缓冲区(从不同的Read()调用)@Wiz问题不是发现HTTP头的结尾,当所有的TCP数据都被接收到时,它就会被发现。这恰好是HTTP,可以是任何TCP协议。然后,我认为它更多地取决于传输协议本身。一些协议包括某种类型的头,它将指示预期的数据长度。其他人可能会在数据结束时关闭连接(导致读取返回0)。其他人可能会在数据末尾写入一个特殊的字节序列。在您的示例中,我认为HTTP会在关闭连接之前等待响应。当连接保持“打开”状态时,除非发送方遵循上述方法之一,否则无法知道发送方已完成所有数据的传输。(如果我忘了什么,请纠正我)@Wiz我想你误解了这个问题。我感兴趣的协议是TCP。HTTP只是方便而已。如果没有可用的数据,Read()调用将等待其他数据。当连接关闭时,它将返回0。由于它没有到达Write()代码,Fiddler正在等待响应。您需要自己检测HTTP请求的结束,以确定何时写入响应。我相信HTTP使用两个连续的换行符(\r\n\r\n)来指示请求中的头的结尾。另外,如果您手动检查\r\n\r\n,请记住它们可能被分割到不同的缓冲区(从不同的Read()调用)@Wiz问题不是发现HTTP头的结尾,当所有的TCP数据都被接收到时,它就会被发现。这恰好是HTTP,可以是任何TCP协议。然后,我认为它更多地取决于传输协议本身。一些协议包括某种类型的头,它将指示预期的数据长度。其他人可能会在数据结束时关闭连接(导致读取返回0)。其他人可能会在数据末尾写入一个特殊的字节序列。在您的示例中,我认为HTTP会在关闭连接之前等待响应。当连接保持“打开”状态时,除非发送方遵循上述方法之一,否则无法知道发送方已完成所有数据的传输。(如果我忘了什么,请纠正我)@Wiz我想你误解了这个问题。我感兴趣的协议是TCP。HTTP只是方便而已。我想知道,当网络传输之间存在延迟时,这会导致什么结果。例如,如果您读取所有可用数据,并在传输下一个数据之前检查DataAvailable,是否会导致应用程序认为在其他数据仍在入站时它已完成。我从阅读文档中了解到,检查数据的结尾是不可靠的。它只表示如果这是真的,Read()调用将立即返回。这可能并不一定意味着没有可用的数据