📄 sockspacket.cpp
字号:
////////////////////////////////////////////////////////////////////////////////
// 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 + -