PcShare2005的HTTP隧道的弊端

2009/2/20 来源:www.arpun.com 作者:小白

它的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建立的通信管道不能交叉接收和发送数据, 所以用两个, 一个负责接收, 一个负责发送

网友评论
评论(...
全部评论