⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sockspacket.cpp

📁 基于Winsock2的支持断点续传和SOCKS代理的HTTP下载类 CHttpDownload
💻 CPP
📖 第 1 页 / 共 2 页
字号:
////////////////////////////////////////////////////////////////////////////////
//	Copyright (C) 2000-2001 Softelf Inc. All rights reserved.
////////////////////////////////////////////////////////////////////////////////
//
//	Author	: Telan
//	Date	: 2000-10-05
//	Purpose	: Implement a SOCKS functions' lib that support socks4,socks4a,socks5
//	History	: 
//		1.0	: 2000-10-04 - Basic Functions Lib
//		1.1	: 2000-10-05 - Fix several bugs in Pack&UnPack
//
//	Mailto	: telan@263.net ( Bugs' Report or Comments )
//	Notes	: This source code may be used in any form in any way you desire. It is
//			  provided "as is" without express or implied warranty.Use it at your own
//			  risk! The author accepts no liability for any damage/loss of business 
//			  that this product may cause.
//
////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "TE_Socket.h"
#include "SocksPacket.h"

////////////////////////////////////////////////////////////////////
//
//		功能: 接收并解包
//		参数: 
//				pBSD		-- BufSocketData数据结构
//				pPacket		-- 数据包指针(用来保存接收数据包)
//				nPacketType	-- 包类型
//				dwTimeOut	-- 接收超时(缺省为SOP_RECV_TIMEOUT)	
//		返回: 
//				 0	---	成功 (SOCKET_SUCCESS)
//				-1	---	失败 (SOCKET_ERROR)	
//
////////////////////////////////////////////////////////////////////
int SOP_RecvPacket(PBSD pBSD,PSOCKSREPPACKET pPacket,UINT nPacketType,DWORD dwTimeout /*= SOP_RECV_TIMEOUT*/)
{
	int		nRecv,n,nCount;
	WORD	wData	= 0;
	DWORD	dwData	= 0;
	char*	pszData	= NULL;

	//清空数据
	ZeroMemory(pPacket,sizeof(SOCKSREQPACKET));

	//接收数据
	switch( nPacketType )
	{
	case PACKET_SOCKS4REP:
		nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
		if( nRecv == TE_EOF )
			return (SOCKET_ERROR);
		pPacket->socks4Rep.bVer = (BYTE)nRecv;

		nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
		if( nRecv == TE_EOF )
			return (SOCKET_ERROR);
		pPacket->socks4Rep.bRep = (BYTE)nRecv;
		
		wData = 0;
		for( n = 0; n < 2; n++)
		{
			nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
			if( nRecv == TE_EOF )
				return (SOCKET_ERROR);
		
			wData |= ( ((WORD)nRecv) << (8*n) );
		}
		pPacket->socks4Rep.wDestPort =ntohs(wData);

		dwData = 0;
		for( n = 0; n < 4; n++)
		{
			nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
			if( nRecv == TE_EOF )
				return (SOCKET_ERROR);

			dwData |= ( ((DWORD)nRecv)<<(8*(3-n)) );
		}
		pPacket->socks4Rep.dwDestIP = ntohl(dwData);
		break;
	case PACKET_SOCKS4AREP:
		nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
		if( nRecv == TE_EOF )
			return (SOCKET_ERROR);
		pPacket->socks4aRep.bVer = (BYTE)nRecv;

		nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
		if( nRecv == TE_EOF )
			return (SOCKET_ERROR);
		pPacket->socks4aRep.bRep = (BYTE)nRecv;
		
		wData = 0;
		for( n = 0; n < 2; n++)
		{
			nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
			if( nRecv == TE_EOF )
				return (SOCKET_ERROR);
		
			wData |= ( ((WORD)nRecv) << (8*(n)) );
		}
		pPacket->socks4aRep.wDestPort = ntohs(wData);

		dwData = 0;
		for( n = 0; n < 4; n++)
		{
			nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
			if( nRecv == TE_EOF )
				return (SOCKET_ERROR);

			dwData |= ( ((DWORD)nRecv)<<(8*(3-n)) );
		}
		pPacket->socks4aRep.dwDestIP = ntohl(dwData);
		break;
	case PACKET_SOCKS5AUTHREP:
		nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
		if( nRecv == TE_EOF )
			return (SOCKET_ERROR);
		pPacket->socks5AuthRep.bVer = (BYTE)nRecv;

		nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
		if( nRecv == TE_EOF )
			return (SOCKET_ERROR);
		
		pPacket->socks5AuthRep.bAuth = (BYTE)nRecv;
		break;
	case PACKET_SOCKS5AUTHPASSWDREP:
		nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
		if( nRecv == TE_EOF )
			return (SOCKET_ERROR);
		pPacket->socks5AuthPasswdRep.bVer = (BYTE)nRecv;

		nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
		if( nRecv == TE_EOF )
			return (SOCKET_ERROR);
		
		pPacket->socks5AuthPasswdRep.bStatus = (BYTE)nRecv;
		break;
	case PACKET_SOCKS5REP:
		nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
		if( nRecv == TE_EOF )
			return (SOCKET_ERROR);
		pPacket->socks5Rep.bVer = (BYTE)nRecv;

		nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
		if( nRecv == TE_EOF )
			return (SOCKET_ERROR);
		pPacket->socks5Rep.bRep = (BYTE)nRecv;

		nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
		if( nRecv == TE_EOF )
			return (SOCKET_ERROR);
		pPacket->socks5Rep.bRsv = (BYTE)nRecv;

		nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
		if( nRecv == TE_EOF )
			return (SOCKET_ERROR);
		pPacket->socks5Rep.bAtyp = (BYTE)nRecv;

		if( pPacket->socks5Rep.bRep != REP5_SUCCESS )
		{
			pPacket->socks5Rep.pszBindAddr = NULL;
			pPacket->socks5Rep.wBindPort   = WORD_NULL;
			break;
		}
		
		switch( pPacket->socks5Rep.bAtyp )
		{
		case ATYP_IPV4ADDR:
		/*
			dwData = 0;
			for( n = 0; n < 4; n++)
			{
				nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
				if( nRecv == TE_EOF )
					return (SOCKET_ERROR);

				dwData |= ( ((DWORD)nRecv)<<(8*(3-n)) );
			}
			dwData = ntohl( dwData );

			pszData = (char *)malloc(5);
			if(pszData == NULL)
				return (SOCKET_ERROR);
			n = 0;
			pszData[n++] = (char)( (dwData>>24) &0x000000ff); 
			pszData[n++] = (char)( (dwData>>16) &0x000000ff); 
			pszData[n++] = (char)( (dwData>>8 ) &0x000000ff); 
			pszData[n++] = (char)( dwData &0x000000ff); 
			pszData[n]	 = '\0';
			*/
			pszData = (char *)malloc(5);
			if(pszData == NULL)
				return (SOCKET_ERROR);
			for( n = 0; n < 4; n++)
			{
				nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
				if( nRecv == TE_EOF )
					return (SOCKET_ERROR);

				pszData[n] = (char)nRecv;
			}
			pszData[n] = '\0';
			pPacket->socks5Rep.pszBindAddr = pszData;
			break;
		case ATYP_IPV6ADDR:
			
			pszData = (char *)malloc(17);
			if(pszData == NULL)
				return (SOCKET_ERROR);
			for( n = 0; n < 16; n++)
			{
				nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
				if( nRecv == TE_EOF )
					return (SOCKET_ERROR);

				pszData[n] = (char)nRecv;
			}
			pszData[n] = '\0';
			pPacket->socks5Rep.pszBindAddr = pszData;
			break;
		case ATYP_HOSTNAME:
			nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
			if( nRecv == TE_EOF )
				return (SOCKET_ERROR);
			
			nCount = nRecv;
			pszData = (char *)malloc(nCount+1 );
			if(pszData == NULL)
				return (SOCKET_ERROR);
			for( n = 0; n < nCount; n++)
			{
				nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
				if( nRecv == TE_EOF )
					return (SOCKET_ERROR);

				pszData[n] = (char)nRecv;
			}
			pszData[n] = '\0';
			pPacket->socks5Rep.pszBindAddr = pszData;
			break;
		default:
			pPacket->socks5Rep.pszBindAddr = NULL;
			break;
		}

		wData = 0;
		for( n = 0; n < 2; n++)
		{
			nRecv = TE_BSocketGetChar(pBSD,dwTimeout);
			if( nRecv == TE_EOF )
				return (SOCKET_ERROR);
		
			wData |= ( ((WORD)nRecv) << (8*n) );
		}
		pPacket->socks5Rep.wBindPort = ntohs(wData);
		break;
	default:
		break;
	}
	return (SOCKET_SUCCESS);
}		

////////////////////////////////////////////////////////////////////
//
//		功能: 计算包的尺寸
//		参数: 
//				pPacket		-- 数据包指针
//				nPacketType	-- PACKET类型
//		返回: 数据包长度
//
////////////////////////////////////////////////////////////////////
int SOP_PacketSize(PSOCKSREQPACKET pPacket,UINT nPacketType)
{
	int nLen = 0;
	switch( nPacketType )
	{
	case PACKET_SOCKS4REQ:
		nLen = 9 + strlen(pPacket->socks4Req.pszUserID);
		break;
	case PACKET_SOCKS4AREQ:
		nLen = 10 + strlen(pPacket->socks4aReq.pszUserID) + strlen(pPacket->socks4aReq.pszDestHostName);
		break;
	case PACKET_SOCKS5AUTHREQ:
		nLen = 2 + (BYTE)pPacket->socks5AuthReq.bNAuth;
		break;
	case PACKET_SOCKS5AUTHPASSWDREQ:
		nLen = 3 + strlen(pPacket->socks5AuthPasswdReq.pszUserName) + strlen(pPacket->socks5AuthPasswdReq.pszPasswd);
		break;
	case PACKET_SOCKS5REQ:
		nLen = 6;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -