Gra*_*rdx 5 c# sockets http tcpclient
我正在构建一个简单的代理,它将记录通过它传递的某些请求。代理不需要干扰通过它的流量(在项目的这一点上),因此我尝试在处理过程中尽可能少地解析原始请求/响应(请求和响应被推送)到要在代理外部记录的队列)。
我的示例工作正常,但无法可靠地判断“响应”何时完成,因此我的连接保持打开状态的时间超过了所需的时间。相关代码如下:
var request = getRequest(url);
byte[] buffer;
int bytesRead = 1;
var dataSent = false;
var timeoutTicks = DateTime.Now.AddMinutes(1).Ticks;
Console.WriteLine(" Sending data to address: {0}", url);
Console.WriteLine(" Waiting for response from host...");
using (var outboundStream = request.GetStream()) {
while (request.Connected && (DateTime.Now.Ticks < timeoutTicks)) {
while (outboundStream.DataAvailable) {
dataSent = true;
buffer = new byte[OUTPUT_BUFFER_SIZE];
bytesRead = outboundStream.Read(buffer, 0, OUTPUT_BUFFER_SIZE);
if (bytesRead > 0) { _clientSocket.Send(buffer, bytesRead, SocketFlags.None); }
Console.WriteLine(" pushed {0} bytes to requesting host...", _backBuffer.Length);
}
if (request.Connected) { Thread.Sleep(0); }
}
}
Console.WriteLine(" Finished with response from host...");
Console.WriteLine(" Disconnecting socket");
_clientSocket.Shutdown(SocketShutdown.Both);
Run Code Online (Sandbox Code Playgroud)
我的问题是是否有一种简单的方法可以在不解析标头的情况下判断响应是否完整。鉴于此响应可以是任何内容(编码、加密、gzip 压缩等),我不想解码实际响应来获取长度并确定是否可以断开套接字。
正如 David 指出的那样,连接应该在一段时间内保持开放。除非客户端这样做(或者保持活动间隔到期),否则不应关闭连接。
更改为 HTTP/1.0 将不起作用,因为您是服务器,而客户端将在请求中指定 HTTP/1.1。当然,你可以发送一个以HTTP/1.0为版本的错误消息并希望客户端更改为1.0,但这似乎效率低下。
HTTP 消息如下所示:
REQUEST LINE
HEADERS
(empty line)
BODY
Run Code Online (Sandbox Code Playgroud)
了解响应何时完成的唯一方法是搜索 Content-Length 标头。只需在请求缓冲区中搜索“Content-Length:”并将所有内容提取到换行符即可。(但在转换为 int 之前修剪找到的值)。
另一种选择是使用我的网络服务器中的解析器来获取所有标头。仅使用解析器应该很容易,而无需使用库中的任何内容。
更新:这里有一个更好的解析器:HttpParser.cs
| 归档时间: |
|
| 查看次数: |
5431 次 |
| 最近记录: |