在开发开源代理脚本时,下面是一段代码: static void Main(string [] args) { string host =“www.google.com”; int proxyPort = 443; // 443;
byte[] buffer = new byte[2048];
int bytes;
// Connect socket
TcpClient client = new TcpClient(host, proxyPort);
NetworkStream stream = client.GetStream();
byte[] tunnelRequest = Encoding.UTF8.GetBytes(String.Format("CONNECT www.google.com:443 HTTP/1.1\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:23.0) Gecko/20100101 Firefox/23.0\r\nProxy-Connection: keep-alive\r\nConnection: keep-alive\r\nHost: www.google.com\r\n\r\n", host));
stream.Write(tunnelRequest, 0, tunnelRequest.Length);
stream.Flush();
SslStream sslStream = new SslStream(stream);
sslStream.AuthenticateAsClient(host);
}
当我运行代码时,在此行中发生错误:sslStream.AuthenticateAsClient(host); 错误的解释是:无法从传输连接中读取数据。远程主机强行关闭现有连接。 或此错误:Autentication失败,因为远程方已关闭传输流。 请帮我 感谢
答案 0 :(得分:2)
您似乎混合了两个概念。 CONNECT谓词用于告诉代理必须构建OPAQUE隧道。在这种情况下,代理只是将从一侧接收的数据转发到另一侧。在这种情况下,您不需要任何SSL。
如果你想充当代理,即接收客户端请求,解析它们,做其他事情,然后连接到服务器获取资源,那么你不需要处理CONNECT动词 - 你代之以处理GET,HEAD ,POST等请求。
更新:我写了一个小article来描述两种类型的代理。