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

📄 sockspacket.cpp

📁 DarkATLSmtp(SMTP COM 组件原创代码),注册后可在Delphi中发邮件。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//作者:高越 邮箱:darkprince@v.cn
//QQ:1738387 (本人只接受技术探讨以及软件项目合作事宜,其他误扰)
#include "stdafx.h"
#include "ProxyConnectSocket.h"
////////////////////////////////////////////////////////////////////
//
//		功能: 接收并解包
//		参数: 
//				pBSD		-- BufSocketData数据结构
//				pPacket		-- 数据包指针(用来保存接收数据包)
//				nPacketType	-- 包类型
//				dwTimeOut	-- 接收超时(缺省为SOP_RECV_TIMEOUT)	
//		返回: 
//				 0	---	成功 (SOCKET_SUCCESS)
//				-1	---	失败 (SOCKET_ERROR)	
//
////////////////////////////////////////////////////////////////////
int CProxyConnectSocket::SOP_RecvPacket(LPTAG_BSD pBSD,LPTAG_SOCKSREPPACKET pPacket,
										UINT nPacketType,DWORD dwTimeout /*= SOP_RECV_TIMEOUT*/)
{
	int		nRecv,n,nCount;
	WORD	wData	= 0;
	DWORD	dwData	= 0;
	char*	pszData	= NULL;

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

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

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

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

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

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

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

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

		nRecv = DPBSocketGetChar(pBSD,dwTimeout);
		if( nRecv == DP_EOF )
			return (SOCKET_ERROR);
		
		pPacket->socks5AuthRep.bAuth = (BYTE)nRecv;
		break;
	case PACKET_SOCKS5AUTHPASSWDREP:
		nRecv = DPBSocketGetChar(pBSD,dwTimeout);
		if( nRecv == DP_EOF )
			return (SOCKET_ERROR);
		pPacket->socks5AuthPasswdRep.bVer = (BYTE)nRecv;
		nRecv = DPBSocketGetChar(pBSD,dwTimeout);
		if( nRecv == DP_EOF )
			return (SOCKET_ERROR);
		pPacket->socks5AuthPasswdRep.bStatus = (BYTE)nRecv;
		break;
	case PACKET_SOCKS5REP:
		nRecv = DPBSocketGetChar(pBSD,dwTimeout);
		if( nRecv == DP_EOF )
			return (SOCKET_ERROR);
		pPacket->socks5Rep.bVer = (BYTE)nRecv;

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

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

		nRecv = DPBSocketGetChar(pBSD,dwTimeout);
		if( nRecv == DP_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 = DPBSocketGetChar(pBSD,dwTimeout);
				if( nRecv == DP_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 = DPBSocketGetChar(pBSD,dwTimeout);
				if( nRecv == DP_EOF )
					return (SOCKET_ERROR);

				pszData[n] = (char)nRecv;
			}
			pszData[n] = '\0';
			pPacket->socks5Rep.pszBindAddr = pszData;
			break;
		case ATYP_HOSTNAME:
			nRecv = DPBSocketGetChar(pBSD,dwTimeout);
			if( nRecv == DP_EOF )
				return (SOCKET_ERROR);
			
			nCount = nRecv;
			pszData = (char *)malloc(nCount+1 );
			if(pszData == NULL)
				return (SOCKET_ERROR);
			for( n = 0; n < nCount; n++)
			{
				nRecv = DPBSocketGetChar(pBSD,dwTimeout);
				if( nRecv == DP_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 = DPBSocketGetChar(pBSD,dwTimeout);
			if( nRecv == DP_EOF )
				return (SOCKET_ERROR);
		
			wData |= ( ((WORD)nRecv) << (8*n) );
		}
		pPacket->socks5Rep.wBindPort = ntohs(wData);
		break;
	default:
		break;
	}
	return (SOCKET_SUCCESS);
}		

////////////////////////////////////////////////////////////////////
//
//		功能: 计算包的尺寸
//		参数: 
//				pPacket		-- 数据包指针
//				nPacketType	-- PACKET类型
//		返回: 数据包长度
//
////////////////////////////////////////////////////////////////////
int CProxyConnectSocket::SOP_PacketSize(LPTAG_SOCKSREQPACKET 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;
		switch( pPacket->socks5Req.bAtyp )
		{
		case ATYP_IPV4ADDR:
			nLen += 4;
			break;
		case ATYP_IPV6ADDR:
			nLen += 16;
			break;
		case ATYP_HOSTNAME:
			nLen += ((BYTE)pPacket->socks5Req.pszDestAddr[0]);
			nLen += 1;
			break;
		}
		break;
	}
	return nLen;
}


/////////////////////////////////////////////////////////////////////////////////////
//
//		功能: 将数据包打包成字符串

⌨️ 快捷键说明

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