它的HTTP隧道是通过wininet API实现的
看看这段代码:重点用红色标记
if(!m_PipeRecv.ConnectHttpServer(
m_ServerAddr, m_ServerPort, nRecv,
INTERNET_FLAG_PRAGMA_NOCACHE
INTERNET_FLAG_NO_CACHE_WRITE
INTERNET_FLAG_RELOAD))
{
StopWork();
return FALSE;
}
if(!HttpSendRequest(m_PipeRecv.hHttpFp , NULL , 0 , NULL, 0))
{
StopWork();
return FALSE;
}
if(!m_PipeSend.ConnectHttpServer(
m_ServerAddr, m_ServerPort, nSend,
INTERNET_FLAG_PRAGMA_NOCACHE
INTERNET_FLAG_NO_CACHE_WRITE
INTERNET_FLAG_RELOAD))
{
StopWork();
return FALSE;
}
INTERNET_BUFFERS BufferIn = {0};
BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS );
BufferIn.dwBufferTotal = 1024 * 1024 * 1024 + 973741824;
if(!HttpSendRequestEx(m_PipeSend.hHttpFp,
&BufferIn,NULL,HSR_INITIATE,0))
{
StopWork();
return FALSE;
}
return TRUE;
/////////////////////////////////////////////////////////////////////////////////////////////////////////
HttpSendRequest(m_PipeRecv.hHttpFp , NULL , 0 , NULL, 0))
有个这些都是POST方式建立的连接, 所以这里POST一个0字节, 因为这个m_PipeRecv是用来接收数据的, 不需要发送数据, 但是他能接收多少数据则由Pcshare里的HTTP响应头Content-Length的数值决定, 一但大于这个数值, 通信就会断开
HttpSendRequestEx里的HSR_INITIATE表示POST的数据, 用InternetWriteFile来发送, 这是POST大数据的方法, 前面有看到这句“BufferIn.dwBufferTotal = 1024 * 1024 * 1024 + 973741824;”, 这定义这个POST的数据大小, 这时候弊端就出来了, 如果我们远程监控的服务端发送的数据量大于了这个数值BufferIn.dwBufferTotal, 这个连接就会断开……
这时候我们发现, Content-Length和BufferIn.dwBufferTotal 都是32位的, 也就是只能传输4GB数据……, 超过了, 连接就会断开……, 而PcShare2005里对这两个数值的设置似乎还都不是最大的,当然了一般情况下, 我们不会用掉这么多的数据量
新版的PcShare应该是用socket模拟的HTTP协议, 抛弃了wininet API的方法吧.。 新版的也没有强调是双管道通信, 双管道其实是迫不得已的设计, wininet建立的通信管道不能交叉接收和发送数据, 所以用两个, 一个负责接收, 一个负责发送
……