sockspacket.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:21k
源码类别:

模拟服务器

开发平台:

C/C++

  1. ////////////////////////////////////////////////////////////////////////////////
  2. // SocksPacket.cpp: implementation of the CSocksPacket class.
  3. ////////////////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "SocksPacket.h"
  6. //////////////////////////////////////////////////////////////////////
  7. // 构造函数
  8. //////////////////////////////////////////////////////////////////////
  9. CSocksPacket::CSocksPacket( CBufSocket* pBufSocket )
  10. {
  11. m_pBufSocket = pBufSocket;
  12. m_nRepPacketType = 0;
  13. }
  14. //////////////////////////////////////////////////////////////////////
  15. // 析构函数
  16. //////////////////////////////////////////////////////////////////////
  17. CSocksPacket::~CSocksPacket()
  18. {
  19. }
  20. ////////////////////////////////////////////////////////////////////////////////
  21. // 函数名:BOOL Pack(
  22. // OUT char *pszDest,
  23. // PSOCKSREQPACKET pPacket,
  24. // int nPacketType ) 
  25. // 用  途:将数据包打包成字符串
  26. // 对全局变量的影响:无
  27. // 参  数:
  28. // pszDest     : 字符串指针,用于保存打包数据(必须预先分配足够的内存空间)
  29. // pPacket     : 数据包指针(待打包的数据包)
  30. // nPacketType : 包类型
  31. // 返回值:BOOL
  32. ////////////////////////////////////////////////////////////////////////////////
  33. BOOL CSocksPacket::Pack(OUT char *pszDest,PSOCKSREQPACKET pPacket,int nPacketType)
  34. {
  35. int n,nIndex=0;
  36. WORD  wData;
  37. DWORD dwData;
  38. switch( nPacketType )
  39. {
  40. case PACKET_SOCKS4REQ:
  41. pszDest[nIndex++] = (char)pPacket->socks4Req.byVer;
  42. pszDest[nIndex++] = (char)pPacket->socks4Req.byCmd;
  43. // 端口
  44. wData = htons(pPacket->socks4Req.wDestPort);
  45. pszDest[nIndex++] = (char)( wData & 0x00ff );
  46. pszDest[nIndex++] = (char)( (wData>>8) & 0x00ff);
  47. // IP地址(不需要再进行htonl转换,由inet_addr出来的IP地址已经是网络字节序)
  48. dwData = pPacket->socks4Req.dwDestIP;
  49. pszDest[nIndex++] = (char)( (dwData    ) &0x000000ff); 
  50. pszDest[nIndex++] = (char)( (dwData>>8 ) &0x000000ff); 
  51. pszDest[nIndex++] = (char)( (dwData>>16) &0x000000ff); 
  52. pszDest[nIndex++] = (char)( (dwData>>24) &0x000000ff); 
  53. // UserID
  54. for( n = 0;n < (int)strlen(pPacket->socks4Req.pszUserID) ; n++ )
  55. pszDest[nIndex++] = (pPacket->socks4Req.pszUserID)[n];
  56. // NULL BYTE
  57. pszDest[nIndex++] = (char)pPacket->socks4Req.byNULL;
  58. pszDest[nIndex] = '';
  59. break;
  60. case PACKET_SOCKS4AREQ:
  61. pszDest[nIndex++] = (char)pPacket->socks4aReq.byVer;
  62. pszDest[nIndex++] = (char)pPacket->socks4aReq.byCmd;
  63. // 端口
  64. wData = htons(pPacket->socks4aReq.wDestPort);
  65. pszDest[nIndex++] = (char)( wData & 0x00ff );
  66. pszDest[nIndex++] = (char)( (wData>>8) & 0x00ff);
  67. // IP地址(不需要再进行htonl转换,由inet_addr出来的IP地址已经是网络字节序)
  68. dwData = pPacket->socks4aReq.dwDestIP;
  69. pszDest[nIndex++] = (char)( (dwData    ) &0x000000ff); 
  70. pszDest[nIndex++] = (char)( (dwData>>8 ) &0x000000ff); 
  71. pszDest[nIndex++] = (char)( (dwData>>16) &0x000000ff); 
  72. pszDest[nIndex++] = (char)( (dwData>>24) &0x000000ff); 
  73. // UserID
  74. for( n = 0;n < (int)strlen(pPacket->socks4aReq.pszUserID) ; n++ )
  75. pszDest[nIndex++] = (pPacket->socks4aReq.pszUserID)[n];
  76. // NULL1 BYTE
  77. pszDest[nIndex++] = (char)pPacket->socks4aReq.byNULL1;
  78. // DestHostName
  79. for( n = 0;n < (int)strlen(pPacket->socks4aReq.pszDestHostName); n++ )
  80. pszDest[nIndex++] = (pPacket->socks4aReq.pszDestHostName)[n];
  81. // NULL2 BYTE
  82. pszDest[nIndex++] = (char)pPacket->socks4aReq.byNULL2;
  83. pszDest[nIndex] = '';
  84. break;
  85. case PACKET_SOCKS5AUTHREQ:
  86. pszDest[nIndex++] = (char)pPacket->socks5AuthReq.byVer;
  87. pszDest[nIndex++] = (char)pPacket->socks5AuthReq.byNAuth;
  88. for( n = 0; n < pPacket->socks5AuthReq.byNAuth;n++ )
  89. pszDest[nIndex++] = (pPacket->socks5AuthReq.pszAuth)[n];
  90. pszDest[nIndex] = '';
  91. break;
  92. case PACKET_SOCKS5AUTHPASSWDREQ:
  93. pszDest[nIndex++] = (char)pPacket->socks5AuthPasswdReq.byVer;
  94. pszDest[nIndex++] = (char)pPacket->socks5AuthPasswdReq.byUserNameLen;
  95. for( n = 0 ; n < (int)strlen( pPacket->socks5AuthPasswdReq.pszUserName ); n++ )
  96. pszDest[nIndex++] = (pPacket->socks5AuthPasswdReq.pszUserName)[n];
  97. pszDest[nIndex++] = (char)pPacket->socks5AuthPasswdReq.byPasswdLen;
  98. for( n = 0; n < (int)strlen(pPacket->socks5AuthPasswdReq.pszPasswd); n++ )
  99. pszDest[nIndex++] = (pPacket->socks5AuthPasswdReq.pszPasswd)[n];
  100. pszDest[nIndex] = '';
  101. break;
  102. case PACKET_SOCKS5REQ:
  103. pszDest[nIndex++] = (char)pPacket->socks5Req.byVer;
  104. pszDest[nIndex++] = (char)pPacket->socks5Req.byCmd;
  105. pszDest[nIndex++] = (char)pPacket->socks5Req.byRsv;
  106. pszDest[nIndex++] = (char)pPacket->socks5Req.byAtyp;
  107. int nAddrLen;
  108. switch(pPacket->socks5Req.byAtyp)
  109. {
  110. case ATYP_IPV4ADDR:
  111. nAddrLen = 4;
  112. /*
  113. 如果目标地址IP = "123.222.111.222"
  114. 则传进来的参数socks5Req.pszDestAddr的形式应该是这样的:
  115. DWORD dwIP = inet_addr("123.222.111.222");
  116. char*  szAddr = new char[5];
  117. szAddr[0] = (char)( dwIP      & 0x000000ff);
  118. szAddr[1] = (char)((dwIP>>8 ) & 0x000000ff);
  119. szAddr[2] = (char)((dwIP>>16) & 0x000000ff);
  120. szAddr[3] = (char)((dwIp>>24) & 0x000000ff);
  121. szAddr[4] = '';
  122. socks5Req.pszDestAddr = szAddr;
  123. */
  124. break;
  125. case ATYP_IPV6ADDR:
  126. nAddrLen = 16;
  127. break;
  128. case ATYP_HOSTNAME:
  129. nAddrLen =  1;
  130. nAddrLen += (BYTE) (pPacket->socks5Req.pszDestAddr[0]);
  131. /*
  132. 如果目标地址DM = "www.yahoo.com"
  133. 则传进来的参数socks5Req.pszDestAddr的形式应该是这样的:
  134. int nLen = strlen("www.yahoo.com");
  135. char* szAddr = new char[nLen+2];
  136. szAddr[0] = (char)nLen; // 第一个字节保存域名的长度
  137. for( int i =0;i<nLen;i++) // 从第二个字节开始才是真正的域名
  138. szAddr[i+1] = DM[i];
  139. szAddr[nLen+1] = '';
  140. socks5Req.pszDestAddr = szAddr;
  141. */
  142. break;
  143. default:
  144. nAddrLen = (int)strlen(pPacket->socks5Req.pszDestAddr);
  145. break;
  146. }
  147. for( n = 0; n <nAddrLen; n++ )
  148. pszDest[nIndex++] = (pPacket->socks5Req.pszDestAddr)[n];
  149. wData = htons(pPacket->socks5Req.wDestPort);
  150. pszDest[nIndex++] = (char)( wData & 0x00ff );
  151. pszDest[nIndex++] = (char)( (wData>>8) & 0x00ff);
  152. pszDest[nIndex] = '';
  153. break;
  154. }
  155. //打包成功
  156. return TRUE;
  157. }
  158. ////////////////////////////////////////////////////////////////////////////////
  159. // 函数名:int PacketSize(
  160. // PSOCKSREQPACKET pPacket,
  161. // int nPacketType ) 
  162. // 用  途:计算包的尺寸
  163. // 对全局变量的影响:无
  164. // 参  数:
  165. // pPacket     : 数据包指针
  166. // nPacketType : PACKET类型
  167. // 返回值:int,数据包长度
  168. ////////////////////////////////////////////////////////////////////////////////
  169. int CSocksPacket::PacketSize(PSOCKSREQPACKET pPacket,int nPacketType)
  170. {
  171. int nLen = 0;
  172. switch( nPacketType )
  173. {
  174. case PACKET_SOCKS4REQ:
  175. nLen = 9 + strlen(pPacket->socks4Req.pszUserID);
  176. break;
  177. case PACKET_SOCKS4AREQ:
  178. nLen = 10 + strlen(pPacket->socks4aReq.pszUserID) + strlen(pPacket->socks4aReq.pszDestHostName);
  179. break;
  180. case PACKET_SOCKS5AUTHREQ:
  181. nLen = 2 + (BYTE)pPacket->socks5AuthReq.byNAuth;
  182. break;
  183. case PACKET_SOCKS5AUTHPASSWDREQ:
  184. nLen = 3 + strlen(pPacket->socks5AuthPasswdReq.pszUserName) + strlen(pPacket->socks5AuthPasswdReq.pszPasswd);
  185. break;
  186. case PACKET_SOCKS5REQ:
  187. nLen = 6;
  188. switch( pPacket->socks5Req.byAtyp )
  189. {
  190. case ATYP_IPV4ADDR:
  191. nLen += 4;
  192. break;
  193. case ATYP_IPV6ADDR:
  194. nLen += 16;
  195. break;
  196. case ATYP_HOSTNAME:
  197. nLen += ((BYTE)pPacket->socks5Req.pszDestAddr[0]);
  198. nLen += 1;
  199. break;
  200. }
  201. break;
  202. }
  203. return nLen;
  204. }
  205. ////////////////////////////////////////////////////////////////////////////////
  206. // 函数名:BOOL SendPacket(
  207. // PSOCKSREQPACKET pPacket,
  208. // int nPacketType,
  209. // DWORD dwTimeout/* = SOP_SEND_TIMEOUT*/ ) 
  210. // 用  途:发送包
  211. // 对全局变量的影响:无
  212. // 参  数:
  213. // pPacket     : 数据包指针(发送数据包)
  214. // nPacketType : 数据包类型
  215. // dwTimeout   :  发送超时(缺省为SOP_SEND_TIMEOUT)
  216. // 返回值:BOOL
  217. ////////////////////////////////////////////////////////////////////////////////
  218. BOOL CSocksPacket::SendPacket(PSOCKSREQPACKET pPacket,int nPacketType,DWORD dwTimeout/* = SOP_SEND_TIMEOUT*/)
  219. {
  220. // 计算包大小
  221. int nSize = PacketSize(pPacket,nPacketType);
  222. char* pSendBuf = (char *)malloc(nSize+1);
  223. if(pSendBuf == NULL)
  224. return FALSE;
  225. int nSend;
  226. BOOL bRet = FALSE;
  227. // 打包并发送
  228. if( Pack(pSendBuf,pPacket,nPacketType) )
  229. {
  230. nSend = m_pBufSocket->Send(pSendBuf,nSize,dwTimeout);
  231. bRet  = (nSend == nSize)? TRUE:FALSE;
  232. }
  233. free(pSendBuf);
  234. return (bRet);
  235. }
  236. ////////////////////////////////////////////////////////////////////////////////
  237. // 函数名:BOOL SendSocks4Req(
  238. // BYTE byCmd,
  239. // WORD wDestPort,
  240. // DWORD dwDestIP,
  241. // const char * pszUserID /* = NULL */,
  242. // DWORD dwTimeout /* = SOP_SEND_TIMEOUT */ ) 
  243. // 用  途:发送Socks4请求
  244. // 对全局变量的影响:无
  245. // 参  数:
  246. // byCmd     : 命令
  247. // wDestPort : 目标端口
  248. // dwDestIP  : 目标IP
  249. // pszUserID : 用户ID
  250. // dwTimeout : 超时
  251. // 返回值:BOOL
  252. ////////////////////////////////////////////////////////////////////////////////
  253. BOOL CSocksPacket::SendSocks4Req(BYTE byCmd,WORD wDestPort,DWORD dwDestIP,const char * pszUserID /* = NULL */,DWORD dwTimeout /* = SOP_SEND_TIMEOUT */)
  254. {
  255. SOCKSREQPACKET pack;
  256. pack.socks4Req.byVer = VER_SOCKS4;
  257. pack.socks4Req.byCmd = byCmd;
  258. pack.socks4Req.wDestPort = wDestPort;
  259. pack.socks4Req.dwDestIP = dwDestIP;
  260. pack.socks4Req.pszUserID = pszUserID;
  261. pack.socks4Req.byNULL = BYTE_NULL;
  262. return SendPacket(&pack,PACKET_SOCKS4REQ,dwTimeout);
  263. }
  264. ////////////////////////////////////////////////////////////////////////////////
  265. // 函数名:BOOL SendSocks4aReq(
  266. // BYTE byCmd,
  267. // WORD wDestPort,
  268. // const char* pszDestHostName,
  269. // const char * pszUserID /* = NULL */,
  270. // DWORD dwTimeout /* = SOP_SEND_TIMEOUT */ ) 
  271. // 用  途:发送Socks4a请求
  272. // 对全局变量的影响:无
  273. // 参  数:
  274. // byCmd           : 命令
  275. // wDestPort       : 端口
  276. // pszDestHostName : 主机名
  277. // pszUserID       : 用户ID
  278. // dwTimeout       : 超时
  279. // 返回值:BOOL
  280. ////////////////////////////////////////////////////////////////////////////////
  281. BOOL  CSocksPacket::SendSocks4aReq(BYTE byCmd,WORD wDestPort,const char* pszDestHostName,const char * pszUserID /* = NULL */,DWORD dwTimeout /* = SOP_SEND_TIMEOUT */)
  282. {
  283. SOCKSREQPACKET pack;
  284. pack.socks4aReq.byVer = VER_SOCKS4A;
  285. pack.socks4aReq.byCmd = byCmd;
  286. pack.socks4aReq.wDestPort = wDestPort;
  287. pack.socks4aReq.dwDestIP = UNKNOWN_IP;
  288. pack.socks4aReq.pszUserID = pszUserID;
  289. pack.socks4aReq.byNULL1 = BYTE_NULL;
  290. pack.socks4aReq.pszDestHostName = pszDestHostName;
  291. pack.socks4aReq.byNULL2 = BYTE_NULL;
  292. return SendPacket(&pack,PACKET_SOCKS4AREQ,dwTimeout);
  293. }
  294. ////////////////////////////////////////////////////////////////////////////////
  295. // 函数名:BOOL SendSocks5AuthReq(
  296. // BYTE byNAuth,
  297. // const char* pszAuth,
  298. // DWORD dwTimeout /* = SOP_SEND_TIMEOUT */ ) 
  299. // 用  途:发送SOCKS5认证请求 
  300. // 对全局变量的影响:无
  301. // 参  数:
  302. // byNAuth   : 认证方式数量
  303. // pszAuth   : 认证方式
  304. // dwTimeout : 超时
  305. // 返回值:BOOL
  306. ////////////////////////////////////////////////////////////////////////////////
  307. BOOL  CSocksPacket::SendSocks5AuthReq(BYTE byNAuth,const char* pszAuth,DWORD dwTimeout /* = SOP_SEND_TIMEOUT */)
  308. {
  309. SOCKSREQPACKET pack;
  310. pack.socks5AuthReq.byVer = VER_SOCKS5;
  311. pack.socks5AuthReq.byNAuth = byNAuth;
  312. pack.socks5AuthReq.pszAuth = pszAuth;
  313. return SendPacket(&pack,PACKET_SOCKS5AUTHREQ,dwTimeout);
  314. }
  315. ////////////////////////////////////////////////////////////////////////////////
  316. // 函数名:BOOL SendSocks5AuthPasswdReq(
  317. // const char* pszUserName,
  318. // const char * pszPassword,
  319. // DWORD dwTimeout /* = SOP_SEND_TIMEOUT */ ) 
  320. // 用  途:发送SOCKS5 USERNAME/PASSWORD验证请求
  321. // 对全局变量的影响:无
  322. // 参  数:
  323. // pszUserName : 用户名
  324. // pszPassword : 口令
  325. // dwTimeout   : 超时
  326. // 返回值:BOOL
  327. ////////////////////////////////////////////////////////////////////////////////
  328. BOOL  CSocksPacket::SendSocks5AuthPasswdReq(const char* pszUserName,const char * pszPassword,DWORD dwTimeout /* = SOP_SEND_TIMEOUT */)
  329. {
  330. SOCKSREQPACKET pack;
  331. pack.socks5AuthPasswdReq.byVer = 0x01;
  332. pack.socks5AuthPasswdReq.byUserNameLen = (BYTE)( (pszUserName == NULL)?0:strlen(pszUserName) );
  333. pack.socks5AuthPasswdReq.pszUserName = pszUserName;
  334. pack.socks5AuthPasswdReq.byPasswdLen = (BYTE)( (pszPassword == NULL)?0:strlen(pszPassword) );
  335. pack.socks5AuthPasswdReq.pszPasswd = pszPassword;
  336. return SendPacket(&pack,PACKET_SOCKS5AUTHPASSWDREQ,dwTimeout);
  337. }
  338. ////////////////////////////////////////////////////////////////////////////////
  339. // 函数名:BOOL SendSocks5Req(
  340. // BYTE byCmd,
  341. // BYTE byAtyp,
  342. // const char * pszDestAddr,
  343. // WORD wDestPort,
  344. // DWORD dwTimeout /* = SOP_SEND_TIMEOUT */ ) 
  345. // 用  途:发送SOCKS5请求
  346. // 对全局变量的影响:无
  347. // 参  数:
  348. // byCmd       : 命令
  349. // byAtyp      : 地址类型
  350. // ATYP_IPV4ADDR pszDestAddr = IPV4_Address (4 Octects)
  351. // ATYP_IPV6ADDR pszDestAddr = IPV6_Address (16 Octects) 
  352. // ATYP_HOSTNAME pszDestAddr = [1BYTE:(HostName)Length]+[HostName]
  353. // pszDestAddr : 目标地址
  354. // wDestPort   : 目标端口
  355. // dwTimeout   : 超时
  356. // 返回值:BOOL
  357. ////////////////////////////////////////////////////////////////////////////////
  358. BOOL  CSocksPacket::SendSocks5Req(BYTE byCmd,BYTE byAtyp,const char * pszDestAddr,WORD wDestPort,DWORD dwTimeout /* = SOP_SEND_TIMEOUT */)
  359. {
  360. SOCKSREQPACKET pack;
  361. pack.socks5Req.byVer = VER_SOCKS5;
  362. pack.socks5Req.byCmd = byCmd;
  363. pack.socks5Req.byRsv = BYTE_NULL;
  364. pack.socks5Req.byAtyp = byAtyp;
  365. pack.socks5Req.pszDestAddr = pszDestAddr;
  366. pack.socks5Req.wDestPort = wDestPort;
  367. return SendPacket(&pack,PACKET_SOCKS5REQ,dwTimeout);
  368. }
  369. ////////////////////////////////////////////////////////////////////////////////
  370. // 函数名:BOOL IsSocksOK(
  371. // PSOCKSREPPACKET pPacket,
  372. // int nPacketType ) 
  373. // 用  途:检查SOCKS的返回值是否正确
  374. // 对全局变量的影响:无
  375. // 参  数:
  376. // pPacket     : 数据包
  377. // nPacketType : 数据包类型
  378. // 返回值:BOOL
  379. ////////////////////////////////////////////////////////////////////////////////
  380. BOOL CSocksPacket::IsSocksOK( PSOCKSREPPACKET pPacket,int nPacketType )
  381. {
  382. switch ( nPacketType )
  383. {
  384. case PACKET_SOCKS4REP:
  385. return ( pPacket->socks4Rep.byRep == REP4_SUCCESS );
  386. break;
  387. case PACKET_SOCKS4AREP:
  388. return ( pPacket->socks4aRep.byRep == REP4_SUCCESS );
  389. break;
  390. case PACKET_SOCKS5AUTHREP:
  391. return ( pPacket->socks5AuthRep.byAuth == AUTH_NONE  ||
  392.  pPacket->socks5AuthRep.byAuth == AUTH_GSSAPI ||
  393.  pPacket->socks5AuthRep.byAuth == AUTH_PASSWD ||
  394.  pPacket->socks5AuthRep.byAuth == AUTH_CHAP ) ;
  395. break;
  396. case PACKET_SOCKS5AUTHPASSWDREP:
  397. return ( pPacket->socks5AuthPasswdRep.byStatus == AUTH_OK );
  398. break;
  399. case PACKET_SOCKS5REP:
  400. return ( pPacket->socks5Rep.byRep == REP5_SUCCESS );
  401. break;
  402. default:
  403. return FALSE;
  404. break;
  405. }
  406. }
  407. ////////////////////////////////////////////////////////////////////////////////
  408. // 函数名:BOOL RecvPacket(
  409. // OUT PSOCKSREPPACKET pPacket,
  410. // int nPacketType,
  411. // DWORD dwTimeout /*= SOP_RECV_TIMEOUT*/ ) 
  412. // 用  途:接收并解包
  413. // 对全局变量的影响:无
  414. // 参  数:
  415. // pPacket     : 数据包指针(用来保存接收数据包)
  416. // nPacketType : 包类型
  417. // dwTimeout   : 接收超时(缺省为SOP_RECV_TIMEOUT)
  418. // 返回值:BOOL
  419. ////////////////////////////////////////////////////////////////////////////////
  420. BOOL CSocksPacket::RecvPacket( OUT PSOCKSREPPACKET pPacket,int nPacketType,DWORD dwTimeout /*= SOP_RECV_TIMEOUT*/)
  421. {
  422. int nRecv,n,nCount;
  423. WORD wData = 0;
  424. DWORD dwData = 0;
  425. char* pszData = NULL;
  426. // 保存类型
  427. m_nRepPacketType = nPacketType;
  428. //接收数据
  429. switch( nPacketType )
  430. {
  431. case PACKET_SOCKS4REP:
  432. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  433. if( nRecv == INVALID_CHAR )
  434. return FALSE;
  435. pPacket->socks4Rep.byVer = (BYTE)nRecv;
  436. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  437. if( nRecv == INVALID_CHAR )
  438. return FALSE;
  439. pPacket->socks4Rep.byRep = (BYTE)nRecv;
  440. wData = 0;
  441. for( n = 0; n < 2; n++)
  442. {
  443. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  444. if( nRecv == INVALID_CHAR )
  445. return FALSE;
  446. wData |= ( ((WORD)nRecv) << (8*n) );
  447. }
  448. pPacket->socks4Rep.wDestPort =ntohs(wData);
  449. dwData = 0;
  450. for( n = 0; n < 4; n++)
  451. {
  452. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  453. if( nRecv == INVALID_CHAR )
  454. return FALSE;
  455. dwData |= ( ((DWORD)nRecv)<<(8*n) );
  456. }
  457. pPacket->socks4Rep.dwDestIP = ntohl(dwData);
  458. break;
  459. case PACKET_SOCKS4AREP:
  460. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  461. if( nRecv == INVALID_CHAR )
  462. return FALSE;
  463. pPacket->socks4aRep.byVer = (BYTE)nRecv;
  464. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  465. if( nRecv == INVALID_CHAR )
  466. return FALSE;
  467. pPacket->socks4aRep.byRep = (BYTE)nRecv;
  468. wData = 0;
  469. for( n = 0; n < 2; n++)
  470. {
  471. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  472. if( nRecv == INVALID_CHAR )
  473. return FALSE;
  474. wData |= ( ((WORD)nRecv) << (8*(n)) );
  475. }
  476. pPacket->socks4aRep.wDestPort = ntohs(wData);
  477. dwData = 0;
  478. for( n = 0; n < 4; n++)
  479. {
  480. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  481. if( nRecv == INVALID_CHAR )
  482. return FALSE;
  483. dwData |= ( ((DWORD)nRecv)<<(8*(n)) );
  484. }
  485. pPacket->socks4aRep.dwDestIP = ntohl(dwData);
  486. break;
  487. case PACKET_SOCKS5AUTHREP:
  488. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  489. if( nRecv == INVALID_CHAR )
  490. return FALSE;
  491. pPacket->socks5AuthRep.byVer = (BYTE)nRecv;
  492. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  493. if( nRecv == INVALID_CHAR )
  494. return FALSE;
  495. pPacket->socks5AuthRep.byAuth = (BYTE)nRecv;
  496. break;
  497. case PACKET_SOCKS5AUTHPASSWDREP:
  498. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  499. if( nRecv == INVALID_CHAR )
  500. return FALSE;
  501. pPacket->socks5AuthPasswdRep.byVer = (BYTE)nRecv;
  502. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  503. if( nRecv == INVALID_CHAR )
  504. return FALSE;
  505. pPacket->socks5AuthPasswdRep.byStatus = (BYTE)nRecv;
  506. break;
  507. case PACKET_SOCKS5REP:
  508. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  509. if( nRecv == INVALID_CHAR )
  510. return FALSE;
  511. pPacket->socks5Rep.byVer = (BYTE)nRecv;
  512. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  513. if( nRecv == INVALID_CHAR )
  514. return FALSE;
  515. pPacket->socks5Rep.byRep = (BYTE)nRecv;
  516. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  517. if( nRecv == INVALID_CHAR )
  518. return FALSE;
  519. pPacket->socks5Rep.byRsv = (BYTE)nRecv;
  520. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  521. if( nRecv == INVALID_CHAR )
  522. return FALSE;
  523. pPacket->socks5Rep.byAtyp = (BYTE)nRecv;
  524. if( pPacket->socks5Rep.byRep != REP5_SUCCESS )
  525. {
  526. pPacket->socks5Rep.pszBindAddr = NULL;
  527. pPacket->socks5Rep.wBindPort   = WORD_NULL;
  528. break;
  529. }
  530. switch( pPacket->socks5Rep.byAtyp )
  531. {
  532. case ATYP_IPV4ADDR:
  533. pszData = (char *)malloc(5);
  534. if(pszData == NULL)
  535. return FALSE;
  536. for( n = 0; n < 4; n++)
  537. {
  538. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  539. if( nRecv == INVALID_CHAR )
  540. return FALSE;
  541. pszData[n] = (char)nRecv;
  542. }
  543. pszData[n] = '';
  544. pPacket->socks5Rep.pszBindAddr = pszData;
  545. break;
  546. case ATYP_IPV6ADDR:
  547. pszData = (char *)malloc(17);
  548. if(pszData == NULL)
  549. return FALSE;
  550. for( n = 0; n < 16; n++)
  551. {
  552. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  553. if( nRecv == INVALID_CHAR )
  554. return FALSE;
  555. pszData[n] = (char)nRecv;
  556. }
  557. pszData[n] = '';
  558. pPacket->socks5Rep.pszBindAddr = pszData;
  559. break;
  560. case ATYP_HOSTNAME:
  561. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  562. if( nRecv == INVALID_CHAR )
  563. return FALSE;
  564. nCount = nRecv;
  565. pszData = (char *)malloc(nCount+1 );
  566. if(pszData == NULL)
  567. return FALSE;
  568. for( n = 0; n < nCount; n++)
  569. {
  570. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  571. if( nRecv == INVALID_CHAR )
  572. return FALSE;
  573. pszData[n] = (char)nRecv;
  574. }
  575. pszData[n] = '';
  576. pPacket->socks5Rep.pszBindAddr = pszData;
  577. break;
  578. default:
  579. pPacket->socks5Rep.pszBindAddr = NULL;
  580. break;
  581. }
  582. wData = 0;
  583. for( n = 0; n < 2; n++)
  584. {
  585. nRecv = m_pBufSocket->BSDGetChar(dwTimeout);
  586. if( nRecv == INVALID_CHAR )
  587. return FALSE;
  588. wData |= ( ((WORD)nRecv) << (8*n) );
  589. }
  590. pPacket->socks5Rep.wBindPort = ntohs(wData);
  591. break;
  592. default:
  593. return FALSE;
  594. break;
  595. }
  596. return TRUE;
  597. }
  598. ////////////////////////////////////////////////////////////////////////////////
  599. // 函数名:BOOL RecvPacket(
  600. // int nPacketType,
  601. // DWORD dwTimeout /*= SOP_RECV_TIMEOUT*/ ) 
  602. // 用  途:接收并解包
  603. // 对全局变量的影响:无
  604. // 参  数:
  605. // nPacketType : 包类型
  606. // dwTimeout   : 接收超时(缺省为SOP_RECV_TIMEOUT)
  607. // 返回值:BOOL
  608. ////////////////////////////////////////////////////////////////////////////////
  609. BOOL CSocksPacket::RecvPacket( int nPacketType,DWORD dwTimeout /*= SOP_RECV_TIMEOUT*/)
  610. {
  611. ZeroMemory( &m_stRepPacket,sizeof(SOCKSREPPACKET) );
  612. return RecvPacket( &m_stRepPacket,nPacketType,dwTimeout );
  613. }
  614. ////////////////////////////////////////////////////////////////////////////////
  615. // 函数名:BOOL IsSocksOK()
  616. // 用  途:检查SOCKS的返回值是否正确
  617. // 对全局变量的影响:无
  618. // 参  数:无
  619. // 返回值:BOOL
  620. ////////////////////////////////////////////////////////////////////////////////
  621. BOOL CSocksPacket::IsSocksOK( )
  622. {
  623. return IsSocksOK(&m_stRepPacket,m_nRepPacketType);
  624. }