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

📄 sockspacket.cpp

📁 类似于flashget的下载软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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;
}


/////////////////////////////////////////////////////////////////////////////////////
//
//		功能: 将数据包打包成字符串
//		参数: 
//				pszDest		-- 字符串指针,用于保存打包数据(必须预先分配足够的内存空间)
//				pPacket		-- 数据包指针(待打包的数据包)
//				nPacketType	-- 包类型
//		返回: 
//				 0	---	成功 (SOCKET_SUCCESS)
//
/////////////////////////////////////////////////////////////////////////////////////
int SOP_Pack(char *pszDest,PSOCKSREQPACKET pPacket,UINT nPacketType)
{

	int n,nIndex=0;
	WORD  wData;
	DWORD dwData;

	switch( nPacketType )
	{
	case PACKET_SOCKS4REQ:
		pszDest[nIndex++] = (char)pPacket->socks4Req.bVer;
		pszDest[nIndex++] = (char)pPacket->socks4Req.bCmd;
		
		// 端口
		wData = htons(pPacket->socks4Req.wDestPort);
		pszDest[nIndex++] = (char)( wData & 0x00ff );
		pszDest[nIndex++] = (char)( (wData>>8) & 0x00ff);
		
		// IP地址
		dwData = htonl(pPacket->socks4Req.dwDestIP);
		pszDest[nIndex++] = (char)( (dwData>>24) &0x000000ff); 
		pszDest[nIndex++] = (char)( (dwData>>16) &0x000000ff); 
		pszDest[nIndex++] = (char)( (dwData>>8 ) &0x000000ff); 
		pszDest[nIndex++] = (char)( dwData &0x000000ff); 
		
		// UserID
		for( n = 0;n < (int)strlen(pPacket->socks4Req.pszUserID) ; n++ )
			pszDest[nIndex++] = (pPacket->socks4Req.pszUserID)[n];
		
		// NULL BYTE
		pszDest[nIndex++]	= (char)pPacket->socks4Req.bNULL;
		pszDest[nIndex]		= '\0';
		break;
	case PACKET_SOCKS4AREQ:
		pszDest[nIndex++] = (char)pPacket->socks4aReq.bVer;
		pszDest[nIndex++] = (char)pPacket->socks4aReq.bCmd;
				
		wData = htons(pPacket->socks4aReq.wDestPort);
		pszDest[nIndex++] = (char)( wData & 0x00ff );
		pszDest[nIndex++] = (char)( (wData>>8) & 0x00ff);
		
		dwData = htonl(pPacket->socks4aReq.dwDestIP);
		pszDest[nIndex++] = (char)( (dwData>>24) &0x000000ff); 
		pszDest[nIndex++] = (char)( (dwData>>16) &0x000000ff); 
		pszDest[nIndex++] = (char)( (dwData>>8 ) &0x000000ff); 
		pszDest[nIndex++] = (char)( dwData &0x000000ff); 
		
		// UserID
		for( n = 0;n < (int)strlen(pPacket->socks4aReq.pszUserID) ; n++ )
			pszDest[nIndex++] = (pPacket->socks4aReq.pszUserID)[n];
		
		// NULL1 BYTE
		pszDest[nIndex++]	= (char)pPacket->socks4aReq.bNULL1;

		// DestHostName
		for( n = 0;n < (int)strlen(pPacket->socks4aReq.pszDestHostName); n++ )
			pszDest[nIndex++] = (pPacket->socks4aReq.pszDestHostName)[n];
		
		// NULL2 BYTE
		pszDest[nIndex++]	= (char)pPacket->socks4aReq.bNULL2;
		pszDest[nIndex]		= '\0';
		break;
	case PACKET_SOCKS5AUTHREQ:
		pszDest[nIndex++]	= (char)pPacket->socks5AuthReq.bVer;
		pszDest[nIndex++]	= (char)pPacket->socks5AuthReq.bNAuth;
		for( n = 0; n < pPacket->socks5AuthReq.bNAuth;n++ )
			pszDest[nIndex++] = (pPacket->socks5AuthReq.pszAuth)[n];
		pszDest[nIndex]		= '\0';
		break;
	case PACKET_SOCKS5AUTHPASSWDREQ:
		pszDest[nIndex++]	= (char)pPacket->socks5AuthPasswdReq.bVer;
		pszDest[nIndex++]	= (char)pPacket->socks5AuthPasswdReq.bUserNameLen;

		for( n = 0 ; n < (int)strlen( pPacket->socks5AuthPasswdReq.pszUserName ); n++ )
			pszDest[nIndex++] = (pPacket->socks5AuthPasswdReq.pszUserName)[n];

		pszDest[nIndex++]	= (char)pPacket->socks5AuthPasswdReq.bPasswdLen;

		for( n = 0; n < (int)strlen(pPacket->socks5AuthPasswdReq.pszPasswd); n++ )
			pszDest[nIndex++] = (pPacket->socks5AuthPasswdReq.pszPasswd)[n];
		pszDest[nIndex]		= '\0';
		break;
	case PACKET_SOCKS5REQ:
		pszDest[nIndex++]	= (char)pPacket->socks5Req.bVer;
		pszDest[nIndex++]	= (char)pPacket->socks5Req.bCmd;
		pszDest[nIndex++]	= (char)pPacket->socks5Req.bRsv;
		pszDest[nIndex++]	= (char)pPacket->socks5Req.bAtyp;

		int nAddrLen;
		switch(pPacket->socks5Req.bAtyp)
		{
		case ATYP_IPV4ADDR:
			nAddrLen = 4;
			break;
		case ATYP_IPV6ADDR:
			nAddrLen = 16;
			break;
		case ATYP_HOSTNAME:
			nAddrLen =  1;
			nAddrLen += (BYTE) (pPacket->socks5Req.pszDestAddr[0]);
			break;
		default:
			nAddrLen = (int)strlen(pPacket->socks5Req.pszDestAddr);
			break;
		}

		for( n = 0; n <nAddrLen; n++ )
			pszDest[nIndex++] = (pPacket->socks5Req.pszDestAddr)[n];

		wData = htons(pPacket->socks5Req.wDestPort);
		pszDest[nIndex++] = (char)( wData & 0x00ff );
		pszDest[nIndex++] = (char)( (wData>>8) & 0x00ff);
		pszDest[nIndex]		= '\0';
		break;
	}

	//打包成功
	return (SOCKET_SUCCESS);
}

////////////////////////////////////////////////////////////////////
//
//		功能: 发送包
//		参数: 
//				hSocket		-- SOCKET(通讯套接字)
//				pPacket		-- 数据包指针(发送数据包)
//				nPacketType	-- 数据包类型
//				dwTimeout	-- 发送超时(缺省为SOP_SEND_TIMEOUT)	
//		返回: 
//				 0	---	成功 (SOCKET_SUCCESS)
//				-1	---	失败 (SOCKET_ERROR)	
//
////////////////////////////////////////////////////////////////////
int SOP_SendPacket(SOCKET hSocket,PSOCKSREQPACKET pPacket,UINT nPacketType,DWORD dwTimeout/* = SOP_SEND_TIMEOUT*/)
{
	if( hSocket == INVALID_SOCKET )
		return (SOCKET_ERROR);

	// 计算包大小
	int		nSize		= SOP_PacketSize(pPacket,nPacketType);
	char*	pSendBuf	= (char *)malloc(nSize+1);

	if(pSendBuf == NULL)
		return (SOCKET_ERROR);

	int nSend;
	int nRet = SOCKET_ERROR;
	
	// 打包并发送
	if(SOP_Pack(pSendBuf,pPacket,nPacketType) == SOCKET_SUCCESS )
	{
		nSend = TE_Send(hSocket,pSendBuf,nSize,dwTimeout);
		nRet  = (nSend == nSize)? SOCKET_SUCCESS:SOCKET_ERROR;
	}

	free(pSendBuf);
	return (nRet);
}

// 发送Socks4 Request
int SOP_SendSocks4Req(SOCKET hSocket,BYTE bCmd,WORD wDestPort,DWORD dwDestIP,const char * pszUserID /* = NULL */,DWORD dwTimeout /* = SOP_SEND_TIMEOUT */)
{
	SOCKSREQPACKET pack;
	pack.socks4Req.bVer			= VER_SOCKS4;
	pack.socks4Req.bCmd			= bCmd;
	pack.socks4Req.wDestPort	= wDestPort;
	pack.socks4Req.dwDestIP		= dwDestIP;
	pack.socks4Req.pszUserID	= pszUserID;
	pack.socks4Req.bNULL		= BYTE_NULL;
	
	return SOP_SendPacket(hSocket,&pack,PACKET_SOCKS4REQ,dwTimeout);
}


// 发送Socks4a Request
int SOP_SendSocks4aReq(SOCKET hSocket,BYTE bCmd,WORD wDestPort,const char* pszDestHostName,const char * pszUserID /* = NULL */,DWORD dwTimeout /* = SOP_SEND_TIMEOUT */)
{
	SOCKSREQPACKET pack;
	pack.socks4aReq.bVer			= VER_SOCKS4A;
	pack.socks4aReq.bCmd			= bCmd;
	pack.socks4aReq.wDestPort		= wDestPort;
	pack.socks4aReq.dwDestIP		= UNKNOWN_IP;
	pack.socks4aReq.pszUserID		= pszUserID;
	pack.socks4aReq.bNULL1			= BYTE_NULL;
	pack.socks4aReq.pszDestHostName = pszDestHostName;
	pack.socks4aReq.bNULL2			= BYTE_NULL;

	return SOP_SendPacket(hSocket,&pack,PACKET_SOCKS4AREQ,dwTimeout);
}

// 发送SOCKS5 Auth-Request
int SOP_SendSocks5AuthReq(SOCKET hSocket,BYTE bNAuth,const char* pszAuth,DWORD dwTimeout /* = SOP_SEND_TIMEOUT */)
{
	SOCKSREQPACKET pack;
	pack.socks5AuthReq.bVer			= VER_SOCKS5;
	pack.socks5AuthReq.bNAuth		= bNAuth;
	pack.socks5AuthReq.pszAuth		= pszAuth;

	return SOP_SendPacket(hSocket,&pack,PACKET_SOCKS5AUTHREQ,dwTimeout);
}

// 发送SOCKS5 USERNAME/PASSWORD Auth-Request
int SOP_SendSocks5AuthPasswdReq(SOCKET hSocket,const char* pszUserName,const char * pszPassword,DWORD dwTimeout /* = SOP_SEND_TIMEOUT */)
{
	SOCKSREQPACKET pack;
	pack.socks5AuthPasswdReq.bVer			= 0x01;
	pack.socks5AuthPasswdReq.bUserNameLen	= (BYTE)( (pszUserName == NULL)?0:strlen(pszUserName) );
	pack.socks5AuthPasswdReq.pszUserName	= pszUserName;
	pack.socks5AuthPasswdReq.bPasswdLen		= (BYTE)( (pszPassword == NULL)?0:strlen(pszPassword) );
	pack.socks5AuthPasswdReq.pszPasswd		= pszPassword;

	return SOP_SendPacket(hSocket,&pack,PACKET_SOCKS5AUTHPASSWDREQ,dwTimeout);
}


// 发送SOCKS5 REQUEST
//
// 注意: 若bAtyp = ATYP_IPV4ADDR pszDestAddr = IPV4_Address (4 Octects)
//		   bAtyp = ATYP_IPV6ADDR pszDestAddr = IPV6_Address (16 Octects) 	
//		   bAtyp = ATYP_HOSTNAME pszDestAddr = [1BYTE:(HostName)Length]+[HostName]	
//
int SOP_SendSocks5Req(SOCKET hSocket,BYTE bCmd,BYTE bAtyp,const char * pszDestAddr,WORD wDestPort,DWORD dwTimeout /* = SOP_SEND_TIMEOUT */)
{
	SOCKSREQPACKET pack;
	pack.socks5Req.bVer			= VER_SOCKS5;
	pack.socks5Req.bCmd			= bCmd;
	pack.socks5Req.bRsv			= BYTE_NULL;
	pack.socks5Req.bAtyp		= bAtyp;
	pack.socks5Req.pszDestAddr	= pszDestAddr;
	pack.socks5Req.wDestPort	= wDestPort;
	return SOP_SendPacket(hSocket,&pack,PACKET_SOCKS5REQ,dwTimeout);
}

// 检查SOCKS的返回值是否正确
BOOL SOP_IsSocksOK( PSOCKSREPPACKET pPacket,UINT nPacketType )
{
	switch ( nPacketType )
	{
	case PACKET_SOCKS4REP:
		return ( pPacket->socks4Rep.bRep == REP4_SUCCESS );
		break;
	case PACKET_SOCKS4AREP:
		return ( pPacket->socks4aRep.bRep == REP4_SUCCESS );
		break;
	case PACKET_SOCKS5AUTHREP:
		return ( pPacket->socks5AuthRep.bAuth == AUTH_NONE	 ||
				 pPacket->socks5AuthRep.bAuth == AUTH_GSSAPI ||
				 pPacket->socks5AuthRep.bAuth == AUTH_PASSWD ||
				 pPacket->socks5AuthRep.bAuth == AUTH_CHAP ) ;
		break;
	case PACKET_SOCKS5AUTHPASSWDREP:
		return ( pPacket->socks5AuthPasswdRep.bStatus == AUTH_OK );
		break;
	case PACKET_SOCKS5REP:
		return ( pPacket->socks5Rep.bRep == REP5_SUCCESS );
		break;
	default:
		return FALSE;
		break;
	}
}

⌨️ 快捷键说明

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