C# HTTP 1.1请求消息在通过套接字获取结果时无法获取最后一个字节块
这是我的草稿代码:C# HTTP 1.1请求消息在通过套接字获取结果时无法获取最后一个字节块,c#,.net,sockets,http,connection,C#,.net,Sockets,Http,Connection,这是我的草稿代码: using System; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; namespace SocketsDemo { class Program { static void Main(string[] args) { Uri uri; if (args.Any
using System;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace SocketsDemo
{
class Program
{
static void Main(string[] args)
{
Uri uri;
if (args.Any()) uri = new Uri(args[0]);
else uri = new Uri("http://odetocode.com/Articles/473.aspx"); //http://www.odetocode.com
var result = GetResource(uri);
Console.WriteLine(result);
Console.ReadLine();
}
private static string GetResource(Uri uri)
{
var host = uri.Host;
var resource = uri.PathAndQuery;
var hostEntry = Dns.GetHostEntry(host);
var socket = CreateSocket(hostEntry);
SendRequest(socket, host, resource);
return GetResponse(socket);
}
private static Socket CreateSocket(IPHostEntry hostEntry)
{
const int HTTP_PORT = 80;
var endPoint = new IPEndPoint(hostEntry.AddressList[0], HTTP_PORT);
var socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(endPoint);
return socket.Connected ? socket : null;
}
private static void SendRequest(Socket socket, string host, string resource)
{
var requestMessage = String.Format(
"GET {0} HTTP/1.1\r\n" +
"HOST: {1}\r\n" +
"\r\n", resource, host);
var requestBytes = Encoding.ASCII.GetBytes(requestMessage);
socket.Send(requestBytes);
}
private static string GetResponse(Socket socket)
{
int bytesCount = 0;
var buffer = new byte[256];
var result = new StringBuilder();
do
{
bytesCount = socket.Receive(buffer);
result.Append(Encoding.ASCII.GetString(buffer, 0, bytesCount));
} while (bytesCount > 0);
return result.ToString();
}
}
}
当我将SendRequest
方法中请求消息的HTTP部分更改为HTTP/1.0时,一切正常。
但当我试图在HTTP/1.1上重复这一点时,这个块do{..},而(bytescont>0)
在181周期挂起。看起来服务器或客户端无法处理最后一块字节。
谁能解释一下这背后的原因,以及我如何通过对现有代码的最小更改来修复这一问题。这就是http的“保持活力”功能。服务器在发送消息后不会断开连接,让您等待进一步的数据
您必须解析HTTP头。如果存在传输编码:chunked
,则必须解析正在接收的块,直到接收到一个0字节的块
如果不是以块的形式发送,则必须解析内容长度
头,以查看总共要读取多少字节
HTTP/1.0不支持区块,一些客户端不支持保持连接活动,因此对于HTTP/1.0,默认服务器行为应为保持活动关闭
,而对于HTTP/1.1,默认为打开
请参见您确定循环永远不会结束吗?当使用HTTP/1.0时,您通常一次接收所有数据(或几次迭代,因为您的缓冲区是256字节),其中HTTP/1.1支持“分块”响应-您可能会得到100个10字节的分块,而不是4乘以256。您能检查循环每次迭代中包含的bytescout
吗?HTTP 1.0最多256次(不总是),最后一次为0;在HTTP1.1上,我得到了类似的行为,我在180个周期中得到了45803字节,在181个周期中,它挂在bytescont=socket.Receive(缓冲区)上代码>,直到服务器断开连接。从HTTP1.0中,我测量得到的字节总数是45944字节。任何想法。看起来服务器或客户端无法处理最后一个区块。我想我错过了一些非常简单的事情:))