www.pudn.com > 221315556.rar > Socket.cpp


// MirSocket.cpp: implementation of the CMirSocket class. 
// 
////////////////////////////////////////////////////////////////////// 
 
 
#include "stdserver.h" 
#include "Socket.h" 
#include  
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CSocket::CSocket() 
{ 
 
} 
 
CSocket::~CSocket() 
{ 
 
} 
int CSocket::SetNoBlock( SOCKET s ) 
{ 
	unsigned long mode = 1; 
	if( ioctlsocket( s, FIONBIO, &mode ) == -1 ) 
		return 0; 
	return 1; 
} 
int CSocket::SetBlock( SOCKET s ) 
{ 
	unsigned long mode = 0; 
	if( ioctlsocket( s, FIONBIO, &mode ) == -1 ) 
		return 0; 
	return 1; 
} 
BOOL	CSocket::NetStartup() 
{ 
	return NetStartup( 2,2 ); 
} 
BOOL	CSocket::NetCleanup() 
{ 
	return WSACleanup(); 
} 
 
SOCKET	CSocket::OpenConnection( const char * ip, const UINT port ) 
{ 
	LPHOSTENT m_pHost; 
	SOCKET	s; 
	struct	sockaddr_in ServAddr; 
	m_pHost = gethostbyname(ip); 
	s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
	ServAddr.sin_family	= AF_INET; 
	ServAddr.sin_addr.s_addr = *(ULONG *)m_pHost->h_addr_list[0]; 
	ServAddr.sin_port = htons(port); 
	int erri = connect(s, (struct sockaddr *)&ServAddr, sizeof(ServAddr)); 
	if( erri == -1) 
		return 0; 
	return s; 
} 
void	CSocket::CloseConnection( SOCKET s ) 
{ 
	closesocket( s ); 
} 
 
 
SOCKET CSocket::Listen(UINT port, int maxqueue) 
{ 
	struct	sockaddr_in	serveraddr; 
	SOCKET	s; 
	s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
	if( s == INVALID_SOCKET ) 
		return 0; 
 
	memset( (void*)&serveraddr, 0, sizeof( struct sockaddr_in )); 
 
	serveraddr.sin_family = PF_INET; 
    serveraddr.sin_addr.s_addr = htonl( INADDR_ANY ); 
	serveraddr.sin_port = htons( port ); 
	 
	 
	if( bind(s, (struct sockaddr * )&serveraddr, sizeof( struct sockaddr_in )) < 0 ) 
	{ 
		closesocket( s ); 
		return 0; 
	} 
	if( listen( s, maxqueue ) == SOCKET_ERROR ) 
	{	 
		closesocket( s ); 
		return 0; 
	} 
	 
	return s; 
} 
 
BOOL CSocket::Accept(SOCKET sListen, SOCKET & sAccept) 
{ 
	sockaddr_in	addr; 
	int addrlen; 
	addrlen = sizeof( addr ); 
 
	sAccept = accept( sListen, (sockaddr*)&addr, &addrlen ); 
	printf( "%u.%u.%u.%u:%u connected!\n", addr.sin_addr.S_un.S_addr & 0xff, (addr.sin_addr.S_un.S_addr & 0xff00)>>8, (addr.sin_addr.S_un.S_addr & 0xff0000)>>16, (addr.sin_addr.S_un.S_addr & 0xff000000)>>24, htons(addr.sin_port) ); 
	if( sAccept != INVALID_SOCKET ) 
	{ 
		return TRUE; 
	} 
	return FALSE; 
} 
 
int CSocket::Recv(SOCKET s, void *buf, int len) 
{ 
	return recv( s, (char*)buf, len, 0 ); 
} 
 
int CSocket::Send(SOCKET s, void *buf, int len) 
{ 
	return send( s, (char*)buf, len, 0 ); 
} 
 
// 网络初始化 
BOOL CSocket::NetStartup(int ver1, int ver2) 
{ 
	WSADATA m_wsaData; 
	return (WSAStartup(MAKEWORD(ver1,ver2), &m_wsaData) != SOCKET_ERROR); 
} 
 
BOOL CSocket::Accept(SOCKET sListen, SOCKET& sAccept, char* pszIpAddr, UINT& usPort) 
{ 
	sockaddr_in	addr; 
	int addrlen; 
	addrlen = sizeof( addr ); 
 
	sAccept = accept( sListen, (sockaddr*)&addr, &addrlen ); 
 
 
	if( sAccept != INVALID_SOCKET ) 
	{ 
		printf( "%u.%u.%u.%u:%u connected!\n", addr.sin_addr.S_un.S_addr & 0xff, (addr.sin_addr.S_un.S_addr & 0xff00)>>8, (addr.sin_addr.S_un.S_addr & 0xff0000)>>16, (addr.sin_addr.S_un.S_addr & 0xff000000)>>24, htons(addr.sin_port) ); 
		usPort = htons( addr.sin_port ); 
		if( pszIpAddr != NULL ) 
			sprintf( pszIpAddr, "%u.%u.%u.%u", addr.sin_addr.S_un.S_addr & 0xff, (addr.sin_addr.S_un.S_addr & 0xff00)>>8, (addr.sin_addr.S_un.S_addr & 0xff0000)>>16, (addr.sin_addr.S_un.S_addr & 0xff000000)>>24 ); 
		return TRUE; 
	} 
	return FALSE; 
} 
 
BOOL CSocket::OpenConnection(const char * IpAddress ,const UINT Port, PCONNECTION pConnection) 
{ 
	pConnection->Socket = OpenConnection( IpAddress, Port ); 
	if( pConnection->Socket == 0 ) 
		return FALSE; 
	return TRUE; 
} 
 
BOOL CSocket::Listen(UINT Port, int MaxQueue, PCONNECTION pConnection) 
{ 
	if( (pConnection->Socket = Listen( Port, MaxQueue ))== 0 ) 
	{ 
		return FALSE; 
	} 
	pConnection->Port = Port; 
	return TRUE; 
} 
 
BOOL CSocket::Accept(SOCKET sListen, PCONNECTION pConnection) 
{ 
	return Accept( sListen, pConnection->Socket, pConnection->IpAddress, pConnection->Port ); 
} 
 
BOOL CSocket::CloseConnection(PCONNECTION pConnection) 
{ 
	return (closesocket( pConnection->Socket ) != SOCKET_ERROR ); 
	//return 0; 
} 
BOOL CSocket::SetNoBlock(PCONNECTION pConnection) 
{ 
	return SetNoBlock(pConnection->Socket); 
} 
BOOL CSocket::OpenConnection(const char * IpAddress , const UINT Port, PCONNECTION pConnection, int nSeconds) 
{ 
	LPHOSTENT m_pHost; 
	SOCKET	s; 
	struct	sockaddr_in ServAddr; 
	m_pHost = gethostbyname(IpAddress); 
	s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
	if( s == INVALID_SOCKET	) 
		return 0; 
	SetNoBlock(s); 
	ServAddr.sin_family	= AF_INET; 
	ServAddr.sin_addr.s_addr = *(ULONG *)m_pHost->h_addr_list[0]; 
	ServAddr.sin_port = htons(Port); 
 
	int erri = connect(s, (struct sockaddr *)&ServAddr, sizeof(ServAddr)); 
	if( erri == -1 ) 
	{ 
		if(  WSAGetLastError() == 10035 ) 
		{ 
			fd_set	fds; 
			fds.fd_count = 0; 
			FD_SET(s,&fds); 
			timeval	tv; 
			tv.tv_sec = nSeconds; 
			tv.tv_usec = 0; 
			select( 0, 0, &fds, 0,&tv ); 
			if(! FD_ISSET(s, &fds )) 
			{ 
				return FALSE; 
			} 
		} 
		else 
		{ 
			return FALSE; 
		} 
	} 
	pConnection->Socket = s; 
	pConnection->Port = Port; 
	strncpy( pConnection->IpAddress, IpAddress, 16 ); 
	pConnection->IpAddress[16] = '\0'; 
	return TRUE; 
 } 
 
BOOL CSocket::UDPBind(char* szIpAddress, UINT uPort, PCONNECTION pConnection) 
{ 
	/* 
	LPHOSTENT m_pHost; 
	SOCKET	s; 
	struct	sockaddr_in ServAddr; 
	m_pHost = gethostbyname(ip); 
	s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
	if( s == INVALID_SOCKET) 
		return FALSE; 
	ServAddr.sin_family	= AF_INET; 
	ServAddr.sin_addr.s_addr = *(ULONG *)m_pHost->h_addr_list[0]; 
	ServAddr.sin_port = htons(port); 
	*/ 
	return 0; 
} 
struct sock5req1  
{  
	char Ver;  
	char nMethods;  
	char Methods[255];  
};  
 
struct sock5ans1  
{  
	char Ver;  
	char Method;  
};  
 
struct sock5req2  
{  
	char Ver;  
	char Cmd;  
	char Rsv;  
	char Atyp;  
	char other[1];  
};  
 
struct sock5ans2  
{  
	char Ver;  
	char Rep;  
	char Rsv;  
	char Atyp;  
	char other[1];  
};  
 
struct authreq  
{  
	char Ver;  
	char Ulen;  
	char Name[255];  
	char PLen;  
	char Pass[255];  
};  
 
struct authans  
{  
	char Ver;  
	char Status;  
};  
 
BOOL CSocket::OpenConnection(const char * IpAddress , const UINT Port,const char * szProxyIpAddress , const UINT nProxyPort,const CHAR*szProxyUserName, const CHAR *szProxyPassword, UINT	nProxyType,  PCONNECTION pConnection ) 
{ 
	if( !OpenConnection( szProxyIpAddress, nProxyPort, pConnection )) 
	{ 
		return FALSE; 
	} 
	char buff[600]; 
	struct sock5req1 *m_proxyreq1;  
	m_proxyreq1 = (struct sock5req1 *)buff;  
	m_proxyreq1->Ver = 5;  
	m_proxyreq1->nMethods = 2;  
	m_proxyreq1->Methods[0] = 0;  
	m_proxyreq1->Methods[1] = 2;  
	send(pConnection->Socket, buff,4, 0);  
	struct sock5ans1 *m_proxyans1;  
	m_proxyans1 = (struct sock5ans1 *)buff;  
	memset(buff,0,600);  
	recv(pConnection->Socket,buff,600, 0);  
	if(m_proxyans1->Ver != 5 || (m_proxyans1->Method!=0 && m_proxyans1->Method!=2))  
	{  
		printf("通过代理连接主站不成功!\n");  
		CloseConnection(pConnection); 
		return FALSE;  
	}  
	if(m_proxyans1->Method == 2)  
	{ 
 
		int nUserLen = strlen("abcdefg");  
		int nPassLen = strlen("1234556");  
		struct authreq *m_authreq;  
		m_authreq = (struct authreq *)buff;  
		m_authreq->Ver = 1;  
		m_authreq->Ulen = nUserLen;  
		strcpy(m_authreq->Name,"abcdefg");  
		m_authreq->PLen = nPassLen;  
		strcpy(m_authreq->Pass,"1234556");  
		send(pConnection->Socket,buff,513, 0);  
		struct authans *m_authans;  
		m_authans = (struct authans *)buff;  
		memset(buff,0,600);  
		recv(pConnection->Socket,buff,600,0);  
		if(m_authans->Ver != 1 || m_authans->Status != 0)  
		{  
			printf("代理服务器用户验证不成功!\n");  
			CloseConnection(pConnection); 
			return FALSE;  
		}  
	}  
	struct sock5req2 *m_proxyreq2;  
	m_proxyreq2 = (struct sock5req2 *)buff;  
	m_proxyreq2->Ver = 5;  
	m_proxyreq2->Cmd = 1;  
	m_proxyreq2->Rsv = 0;  
	m_proxyreq2->Atyp = 1;  
	unsigned long tmpLong = inet_addr(IpAddress);  
	unsigned short port = ntohs(Port);//GetPort());  
	memcpy(m_proxyreq2->other,&tmpLong,4);  
	memcpy(m_proxyreq2->other+4,&port,2);  
	send(pConnection->Socket, buff,sizeof(struct sock5req2)+5, 0);  
	struct sock5ans2 *m_proxyans2;  
	memset(buff,0,600);  
	m_proxyans2 = (struct sock5ans2 *)buff;  
	recv(pConnection->Socket,buff,600, 0);  
	if(m_proxyans2->Ver != 5 || m_proxyans2->Rep != 0)  
	{  
		printf("通过代理连接主站不成功!\n");  
		CloseConnection(pConnection);  
		return FALSE;  
	}  
 
 
	return TRUE; 
}