ProxySocket.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:8k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. // ProxySocket.cpp: implementation of the CProxySocket class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include <atlconv.h>
  6. #include "ProxySocket.h"
  7. #include "base64.h"
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[]=__FILE__;
  11. #define new DEBUG_NEW
  12. #endif
  13. //////////////////////////////////////////////////////////////////////
  14. // Construction/Destruction
  15. //////////////////////////////////////////////////////////////////////
  16. CProxySocket::CProxySocket()
  17. {
  18. m_ProxyInfo.m_nProxyType = TypeNone;
  19. }
  20. CProxySocket::~CProxySocket()
  21. {
  22. }
  23. CString CProxySocket::GetLastErrorString( )
  24. {
  25. if( !m_strLastError.IsEmpty() )
  26. return m_strLastError;
  27. int nErrorCode = CAsyncSocket::GetLastError();
  28. CString strFmt = AfxModuleLoadString( IDS_PROXYSOCKET_ERRCODEFMT ); // "服务器连接错误(%d)。";
  29. CString strResult;
  30. strResult.Format( strFmt, nErrorCode );
  31. return strResult;
  32. }
  33. BOOL CProxySocket::SetProxyInfo( int nProxyType, LPCTSTR lpszProxyAddress, UINT nProxyPort,
  34. LPCTSTR lpszProxyUser, LPCTSTR lpszProxyPasswd )
  35. {
  36. m_ProxyInfo.m_nProxyType = nProxyType;
  37. m_ProxyInfo.m_strProxyAddress = lpszProxyAddress;
  38. m_ProxyInfo.m_nProxyPort = nProxyPort;
  39. m_ProxyInfo.m_strProxyUser = lpszProxyUser;
  40. m_ProxyInfo.m_strProxyPasswd = lpszProxyPasswd;
  41. return TRUE;
  42. }
  43. BOOL CProxySocket::ConnectThroughProxy( LPCTSTR lpszHostAddress, UINT nHostPort )
  44. {
  45. USES_CONVERSION;
  46. ASSERT(lpszHostAddress != NULL);
  47. SOCKADDR_IN sockAddr;
  48. memset(&sockAddr,0,sizeof(sockAddr));
  49. LPSTR lpszAscii = T2A((LPTSTR)lpszHostAddress);
  50. sockAddr.sin_family = AF_INET;
  51. sockAddr.sin_addr.s_addr = inet_addr(lpszAscii);
  52. if (sockAddr.sin_addr.s_addr == INADDR_NONE)
  53. {
  54. LPHOSTENT lphost;
  55. lphost = gethostbyname(lpszAscii);
  56. if (lphost != NULL)
  57. sockAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
  58. else
  59. {
  60. WSASetLastError(WSAEINVAL);
  61. return FALSE;
  62. }
  63. }
  64. sockAddr.sin_port = htons((u_short)nHostPort);
  65. if( TypeSocks4 == m_ProxyInfo.m_nProxyType )
  66. return ConnectThroughSocks4((SOCKADDR*)&sockAddr, sizeof(sockAddr));
  67. else if( TypeSocks5 == m_ProxyInfo.m_nProxyType )
  68. return ConnectThroughSocks5((SOCKADDR*)&sockAddr, sizeof(sockAddr));
  69. else if( TypeHTTP == m_ProxyInfo.m_nProxyType )
  70. return ConnectThroughHTTP((SOCKADDR*)&sockAddr, sizeof(sockAddr));
  71. else
  72. return Connect((SOCKADDR*)&sockAddr, sizeof(sockAddr));
  73. }
  74. BOOL CProxySocket::ConnectThroughSocks4(const SOCKADDR* lpSockAddr, int nSockAddrLen)
  75. {
  76. PSOCKADDR_IN paddr_in = (PSOCKADDR_IN)lpSockAddr;
  77. //通过Socks4方式代理 
  78. if( !Connect( m_ProxyInfo.m_strProxyAddress,m_ProxyInfo.m_nProxyPort) ) 
  79. m_strLastError = AfxModuleLoadString( IDS_PROXYSOCKET_ERRCONNECTPROXY ); // _T("不能连接到代理服务器!"); 
  80. Close(); 
  81. return FALSE; 
  82. char buffer[128]; 
  83. memset(buffer,0,sizeof(buffer)); 
  84. struct sock4req1 *m_proxyreq; 
  85. m_proxyreq = (struct sock4req1 *)buffer;
  86. m_proxyreq->VN = 4;
  87. m_proxyreq->CD = 1;
  88. m_proxyreq->Port = paddr_in->sin_port; // htons(GetPort());
  89. m_proxyreq->IPAddr = paddr_in->sin_addr.s_addr; // inet_addr(GetServerHostName());
  90. Send(buffer,9);
  91. struct sock4ans1 *m_proxyans; 
  92. m_proxyans = (struct sock4ans1 *)buffer;
  93. memset(buffer,0,sizeof(buffer)); 
  94. int nReceiveLen = Receive(buffer,sizeof(buffer)); 
  95. if(m_proxyans->VN != 0 || m_proxyans->CD != 90) 
  96. m_strLastError = AfxModuleLoadString( IDS_PROXYSOCKET_ERRCONNECTTHROUGHPROXY ); // _T("通过代理连接主站不成功!"); 
  97. Close(); 
  98. return FALSE; 
  99. }
  100. return TRUE;
  101. }
  102. BOOL CProxySocket::ConnectThroughSocks5(const SOCKADDR* lpSockAddr, int nSockAddrLen)
  103. {
  104. PSOCKADDR_IN paddr_in = (PSOCKADDR_IN)lpSockAddr;
  105. //通过Socks5方式代理 
  106. if( !Connect( m_ProxyInfo.m_strProxyAddress,m_ProxyInfo.m_nProxyPort) ) 
  107. m_strLastError = AfxModuleLoadString( IDS_PROXYSOCKET_ERRCONNECTPROXY ); // _T("不能连接到代理服务器!"); 
  108. Close(); 
  109. return FALSE; 
  110. char buffer[1024]; 
  111. struct sock5req1 *m_proxyreq1; 
  112. m_proxyreq1 = (struct sock5req1 *)buffer; 
  113. m_proxyreq1->Ver = 5; 
  114. m_proxyreq1->nMethods = 2; 
  115. m_proxyreq1->Methods[0] = 0; 
  116. m_proxyreq1->Methods[1] = 2; 
  117. Send(buffer,4); 
  118. struct sock5ans1 *m_proxyans1; 
  119. m_proxyans1 = (struct sock5ans1 *)buffer; 
  120. memset(buffer,0,sizeof(buffer)); 
  121. int nReceiveLen = Receive(buffer,sizeof(buffer)); 
  122. if(m_proxyans1->Ver != 5 || (m_proxyans1->Method!=0 && m_proxyans1->Method!=2)) 
  123. m_strLastError = AfxModuleLoadString( IDS_PROXYSOCKET_ERRCONNECTTHROUGHPROXY ); // _T("通过代理连接主站不成功!"); 
  124. Close(); 
  125. return FALSE; 
  126. if(m_proxyans1->Method == 2)
  127. {
  128. int nUserLen = strlen(m_ProxyInfo.m_strProxyUser);
  129. int nPassLen = strlen(m_ProxyInfo.m_strProxyPasswd);
  130. struct authreq *m_authreq;
  131. m_authreq = (struct authreq *)buffer;
  132. m_authreq->Ver = 1;
  133. m_authreq->Ulen = nUserLen;
  134. strcpy(m_authreq->Name,m_ProxyInfo.m_strProxyUser);
  135. m_authreq->Name[nUserLen] = nPassLen;
  136. strcpy(&(m_authreq->Name[nUserLen+1]),m_ProxyInfo.m_strProxyPasswd);
  137. Send(buffer,3+nUserLen+nPassLen);
  138. struct authans *m_authans;
  139. m_authans = (struct authans *)buffer;
  140. memset(buffer,0,sizeof(buffer));
  141. nReceiveLen = Receive(buffer,sizeof(buffer));
  142. if(m_authans->Ver != 1 || m_authans->Status != 0)
  143. {
  144. m_strLastError = AfxModuleLoadString( IDS_PROXYSOCKET_ERRAUTH ); // _T("代理服务器用户验证不成功!");
  145. Close();
  146. return FALSE;
  147. }
  148. }
  149. struct sock5req2 *m_proxyreq2; 
  150. m_proxyreq2 = (struct sock5req2 *)buffer;
  151. m_proxyreq2->Ver = 5; 
  152. m_proxyreq2->Cmd = 1; 
  153. m_proxyreq2->Rsv = 0; 
  154. m_proxyreq2->Atyp = 1; 
  155. unsigned short port = paddr_in->sin_port; // htons(GetPort());
  156. unsigned long tmpLong = paddr_in->sin_addr.s_addr; // inet_addr(GetServerHostName());
  157. memcpy(m_proxyreq2->other,&tmpLong,4); 
  158. memcpy(m_proxyreq2->other+4,&port,2);
  159. Send(buffer,sizeof(struct sock5req2)+5); 
  160. struct sock5ans2 *m_proxyans2; 
  161. memset(buffer,0,sizeof(buffer)); 
  162. m_proxyans2 = (struct sock5ans2 *)buffer;
  163. nReceiveLen = Receive(buffer,sizeof(buffer)); 
  164. if(m_proxyans2->Ver != 5 || m_proxyans2->Rep != 0) 
  165. m_strLastError = AfxModuleLoadString( IDS_PROXYSOCKET_ERRCONNECTTHROUGHPROXY ); // _T("通过代理连接主站不成功!"); 
  166. Close(); 
  167. return FALSE; 
  168. }
  169. return TRUE;
  170. }
  171. BOOL CProxySocket::ConnectThroughHTTP(const SOCKADDR* lpSockAddr, int nSockAddrLen)
  172. {
  173. PSOCKADDR_IN paddr_in = (PSOCKADDR_IN)lpSockAddr;
  174. //通过HTTP方式代理 
  175. if( !Connect( m_ProxyInfo.m_strProxyAddress,m_ProxyInfo.m_nProxyPort) ) 
  176. m_strLastError = AfxModuleLoadString( IDS_PROXYSOCKET_ERRCONNECTPROXY ); // _T("不能连接到代理服务器!"); 
  177. Close(); 
  178. return FALSE; 
  179. char buffer[1024];
  180. CString strUPSrc = m_ProxyInfo.m_strProxyUser + ":" + m_ProxyInfo.m_strProxyPasswd;
  181. CString strUP;
  182. EncodeBase64( strUPSrc, strUP );
  183. memset(buffer,0,sizeof(buffer));
  184. sprintf(buffer,"CONNECT %s:%d HTTP/1.1rn
  185. User-Agent: Ninebulls-Stock/3.0rn
  186. Host: %srn
  187. Pragma: no-cachern
  188. Cache-Control: no-cachern
  189. Connection: Keep-Alivern
  190. Proxy-Connection: Keep-Alivern
  191. Proxy-Authorization: Basic %srn",
  192. inet_ntoa(paddr_in->sin_addr), ntohs(paddr_in->sin_port), inet_ntoa(paddr_in->sin_addr), strUP );
  193. Send(buffer,strlen(buffer));
  194. memset(buffer,0,sizeof(buffer)); 
  195. int nReceiveLen = Receive(buffer,sizeof(buffer));
  196. int httpvn1, httpvn2;
  197. int codenum;
  198. if (!sscanf(buffer, "HTTP/%d.%d %d", &httpvn1, &httpvn2, &codenum))
  199. {
  200. m_strLastError = AfxModuleLoadString( IDS_PROXYSOCKET_ERRVERSION ); // _T("代理服务器版本不匹配!");
  201. Close();
  202. return FALSE;
  203. }
  204. if( 407 == codenum )
  205. {
  206. m_strLastError = AfxModuleLoadString( IDS_PROXYSOCKET_ERRAUTH ); // _T("代理服务器用户验证不成功!");
  207. Close();
  208. return FALSE;
  209. }
  210. if( (codenum/100) == 5 )
  211. {
  212. m_strLastError = AfxModuleLoadString( IDS_PROXYSOCKET_ERRCONNECTTHROUGHPROXY ); // _T("通过代理连接主站不成功!"); 
  213. Close();
  214. return FALSE;
  215. }
  216. // Successful 2xx
  217. // if(strstr(buffer, "HTTP/1.0 200 Connection established") == NULL) //连接不成功
  218. if( (codenum/100) != 2 )
  219. {
  220. m_strLastError = AfxModuleLoadString( IDS_PROXYSOCKET_ERRCONNECTTHROUGHPROXY ); // _T("通过代理连接主站不成功!"); 
  221. Close();
  222. return FALSE;
  223. }
  224. return TRUE;
  225. }