透过代理看世界(http代理篇)[3]

[入库:2006年2月23日] [更新:2007年3月24日]

本文简介:

            CString temp;
            char tmpBuffer[1024];
            temp.Format("CONNECT %s:%s HTTP/1.1\r\nUser-Agent: MyApp/0.1\r\n\r\n",m_ProxyAddr,m_Port);
            if(!SocketSend(HTTPSocket,temp))
            {
                       message="连接代理失败";
                       return 0;
            }

// 取得代理响应,如果连接代理成功,代理服务器将返回200 Connection established

            GetHttpHeader(HTTPSocket,tmpBuffer);
            temp=tmpBuffer;
            if(temp.Find("HTTP/1.0 200 Connection established",0)==-1)
            {
                       message="连接代理失败\n";
                       return 0;
            }

            message="代理连接完成\n";
            m_message.AddText("代理连接完成\n");
            return 1;   // ----------〉这里是应该注意的,连接到代理后,就可以返回了,不需要再连接网上的另外一台机,代理服务器会自动转发数据,所以,连接完代理就像连接到网上另外一台机一样
 }

//  这个,是为了给其他代理做准备
 else if(m_combo=="Socks4")
 {MessageBox("请注意,现在无法使用代理功能!");}
 else if(m_combo=="Socks5")
 {MessageBox("请注意,现在无法使用代理功能!");}

//  如果没有使用代理,就要连接到网上的另一台机

// 准备socket
  HTTPSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
      
 if (HTTPSocket==INVALID_SOCKET)
 {
  AfxMessageBox("Error when socket");
  return 0;
 }

//设置超时
 struct linger zeroLinger;
 zeroLinger.l_onoff = 1;
 zeroLinger.l_linger = 0;
 if(setsockopt(HTTPSocket,SOL_SOCKET,SO_LINGER
  ,(const char *)&zeroLinger
  ,sizeof(zeroLinger))!=0)
 {
            closesocket(HTTPSocket);
            AfxMessageBox("Error when setscokopt(LINGER)");
            return 0;
 }

//设置接收超时
 if(setsockopt(HTTPSocket,SOL_SOCKET,SO_RCVTIMEO
  ,(const char *)&m_nRecvTimeout
  ,sizeof(m_nRecvTimeout))!=0)
 {
            closesocket(HTTPSocket);
            AfxMessageBox("Error when setsockopt(RCVTIME).");
            return 0;
 }

//设置发送超时
 if(setsockopt(HTTPSocket,SOL_SOCKET,SO_SNDTIMEO
  ,(const char *)&m_nSendTimeout
  ,sizeof(m_nSendTimeout))!=0)
 {
            closesocket(HTTPSocket);
            AfxMessageBox("Error when setsockopt(SNDTIMEO).");
            return 0;
 }


 SocketAddr.sin_addr.s_addr = htonl (INADDR_ANY);
 SocketAddr.sin_family=AF_INET;

// 进行端口绑定
 if (bind (HTTPSocket,
  (const struct sockaddr FAR *)&SocketAddr,
  sizeof(SocketAddr))==SOCKET_ERROR)
 {
            closesocket(HTTPSocket);
            AfxMessageBox("Error when bind socket.");
            return 0;
 }

//准备连接

本文关键:透过代理看世界(http代理篇)
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top