我正在研究一个http代理应用程序,一切正常(客户端可以连接到服务器并获取内容),问题既不是HTTP服务器也不是浏览器关闭TCP连接..我不确定我是否我做得对,这是代码:
while (tcp_link.Connected && _tcp.Connected && !ioError)
{
try
{
Thread.Sleep(100);
if (streamLink.DataAvailable)
{
byte[] l_buffer = new byte[10000];
int l_read = streamLink.Read(l_buffer, 0, l_buffer.Length);
byte[] l_data = new byte[l_read];
Array.Copy(l_buffer, l_data, l_data.Length);
_stream.Write(l_data, 0, l_data.Length);
}
if (_stream.DataAvailable)
{
byte[] c_buffer = new byte[10500];
int c_read = _stream.Read(c_buffer, 0, c_buffer.Length);
byte[] c_data = new byte[c_read];
Array.Copy(c_buffer, c_data, c_data.Length);
streamLink.Write(c_data, 0, c_data.Length);
}
}
catch
{
ioError = true;
}
}
我的双方代码相同(代理客户端和代理服务器)
注意:浏览器将连接到代理客户端(位于同一台计算机上),代理客户端将连接到代理服务器,显然代理服务器将连接到http服务器,原因是我之前不想编码数据发送出去
答案 0 :(得分:1)
您发现连接打开的时间有多长?
客户端很可能使用默认情况下启用持久连接的HTTP 1.1。
如果您正在编写代理,那么您应该考虑:http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html
答案 1 :(得分:1)
好的,我发现了问题,谁在那里关闭套接字连接有问题..
实际上,Socket.Available
没有按照我的预期工作,看看套接字是否真正连接你应该检查可用和轮询属性,下面的函数应解决你的问题:thanks to: zendar
bool SocketConnected(Socket s)
{
bool part1 = s.Poll(1000, SelectMode.SelectRead);
bool part2 = (s.Available == 0);
if (part1 & part2)
return false;
else
return true;
}
我希望这也能解决你的问题;)