www.pudn.com > MirGui.rar > MirCore.cpp


#pragma comment( lib, "ws2_32.lib" ) 
#include  
#include  
#include  
#include  
#include "mircode.h" 
typedef struct 
{ 
	union 
	{ 
		DWORD	dwFlag; 
		struct 
		{ 
			WORD	wa; 
			WORD	wb; 
		}; 
	}; 
 
	WORD	wCmd; 
	WORD	w1; 
	WORD	w2; 
	WORD	w3; 
	char	data[1024]; 
}MMSG; 
 
 
#define CGIP	"61.152.97.21" 
#define ACCOUNT		"johndragon" 
#define PASSWORD	"shifully" 
#define WORDS		"各个姐姐弟弟妹妹们,你们好,我是机器人,请多关照!!" 
 
char	g_msgflag	=	'1'; 
char	rcBuffer[4096]; 
typedef char	TSTRING[256]; 
TSTRING	g_StringList[20]; 
int		g_pos_x, g_pos_y; 
char	g_mapname[256]; 
 
#define	MSGHEADERSIZE	12 
#define	MSGLENGTH	1024 
#define	MSGQUEUELEN	256 
typedef char	TMSGLINE[MSGLENGTH]; 
enum _action 
{ 
	ACTION_STAND, 
	ACTION_WALK, 
	ACTION_ATTACK, 
	ACTION_RUN, 
	ACTION_TRUN, 
}; 
typedef struct 
{ 
	int x; 
	int y; 
	int dir; 
	int action; 
}ACTION_LAST; 
 
ACTION_LAST	g_LastAction = {0, 0, 0, 0 }; 
class CMsgQueue   
{ 
public: 
	CMsgQueue() 
	{ 
		m_iGet = 0; 
		m_iPut = 0; 
		Clear(); 
	}; 
	virtual ~CMsgQueue() 
	{ 
		Clear(); 
	}; 
	int NextPos( int now ) 
	{ 
		now++; 
		if( now >= MSGQUEUELEN ) 
			now = 0; 
		return now; 
	} 
	int	PutMsg( char * pMsg ) 
	{ 
		int iNext = NextPos( m_iPut ); 
 
		if( pMsg == NULL ) 
			return 0; 
		if( iNext == m_iGet ) 
		{ 
			return 0; 
		} 
		strcpy( m_Msgs[m_iPut], pMsg ); 
		m_iPut = iNext; 
		return 1; 
	}; 
 
	int GetMsg( char * pMsg ) 
	{ 
		if( m_iGet == m_iPut ) 
			return 0; 
		strcpy( pMsg, m_Msgs[m_iGet] ); 
//		printf( "m_iPut = %d, m_iGet = %d\n", m_iPut, m_iGet ); 
		m_iGet = NextPos( m_iGet ); 
		return 1; 
	}; 
	int	Clear() 
	{ 
		memset( (void*)m_Msgs, 0, sizeof( TMSGLINE ) * MSGQUEUELEN ); 
		return 1; 
	}; 
private: 
	TMSGLINE	m_Msgs[MSGQUEUELEN]; 
	int			m_iGet; 
	int			m_iPut; 
}; 
 
CMsgQueue	g_MsgQueue; 
HWND		m_hSysLog = NULL; 
HWND		m_hChatLog = NULL; 
HWND		m_hMainDlg = NULL; 
int			m_MaxLogLine = 100; 
 
BOOL	InitMirCore( HWND	hMainWnd, HWND	hSysLog, HWND	hChatLog, int MaxLogLine ) 
{ 
	m_hSysLog = hSysLog; 
	m_hChatLog = hChatLog; 
	m_hMainDlg = hMainWnd; 
	m_MaxLogLine = MaxLogLine; 
	return TRUE; 
} 
void	LogToList( HWND hList, char * line ) 
{ 
	int cnt = 0; 
	cnt = ListBox_GetCount( hList ); 
	if( cnt >= m_MaxLogLine ) 
	{ 
		ListBox_DeleteString( hList, 0 ); 
		cnt --; 
	} 
	ListBox_AddString( hList, line ); 
	ListBox_SetCurSel( hList, cnt ); 
} 
 
void	LogChat( char * line,... ) 
{ 
	char	szBuff[2048]; 
	va_list	vl; 
	va_start( vl, line ); 
	vsprintf( szBuff, line, vl ); 
	va_end( vl); 
	LogToList( m_hChatLog, szBuff ); 
} 
 
void	LogSystem( char * line,... ) 
{ 
	char	szBuff[2048]; 
	va_list	vl; 
	va_start( vl, line ); 
	vsprintf( szBuff, line, vl ); 
	va_end( vl); 
	LogToList( m_hSysLog, szBuff ); 
} 
 
int ActionOk() 
{ 
	printf( "Action Ok!\n" ); 
	switch( g_LastAction.action ) 
	{ 
	case	ACTION_RUN: 
	case	ACTION_WALK: 
		g_pos_x = g_LastAction.x; 
		g_pos_y = g_LastAction.y; 
		break; 
	} 
	g_LastAction.action = 0; 
 
	return 1; 
} 
int ActionFail() 
{ 
	printf( "Action Fail!\n" ); 
	g_LastAction.action = 0; 
	return 1; 
} 
int CanDoAction() 
{ 
	if( g_LastAction.action == 0 ) 
		return 1; 
	return 0; 
} 
int GetString( char * string ) 
{ 
	int ilen = strlen( string ); 
	int i = 0; 
	int cnt = 0; 
	int sptr = 0; 
	for( i =0;i < ilen;i ++ ) 
	{ 
		if( string[i] == '/' && i != 0 ) 
		{ 
			g_StringList[cnt][sptr] = '\0'; 
			sptr = 0; 
			cnt++; 
		} 
		else 
		{ 
			g_StringList[cnt][sptr] = string[i]; 
			sptr ++; 
		} 
	} 
	if( sptr > 0 ) 
	{ 
		g_StringList[cnt][sptr] = '\0'; 
		cnt++; 
	} 
	return cnt; 
} 
int SendString( SOCKET s, char * string ) 
{ 
	int ierr = 0; 
	int ilen = strlen( string ); 
//	printf( "Send: %s\n", string ); 
	ierr = send( s, string, strlen( string), 0 ); 
	if( ierr == ilen ) 
	{ 
		g_msgflag ++; 
		if( g_msgflag > '9' ) 
			g_msgflag = '1'; 
	} 
	return ierr; 
} 
int RecvString( SOCKET s, char * string, int maxlen ) 
{ 
	int ierr = 0; 
	char	tmpBuffer[2048]; 
	ierr = recv( s, tmpBuffer, 2048, 0 ); 
	if( ierr !=- 1) 
	{ 
		if( tmpBuffer[0] == '*' ) 
		{ 
			strcpy( string, &tmpBuffer[1]); 
			ierr --; 
		} 
		else 
		{ 
			strcpy( string, tmpBuffer ); 
		} 
		string[ierr] = '\0'; 
//		printf( "Recv:%s\n", string ); 
	} 
	return ierr; 
} 
int RecvMsg( SOCKET s, MMSG * pmsg ) 
{ 
	char tmpBuffer[2048]; 
//	char tmpBuffer2[2048]; 
	int ierr; 
	ierr = RecvString( s, tmpBuffer, 2048 ); 
	if( ierr == -1 ) 
	{ 
		return -1; 
	} 
	if(tmpBuffer[ierr-1] == '!' ) 
	{ 
		tmpBuffer[ierr-1] = '\0'; 
	} 
	UnGameCode( &tmpBuffer[1], (BYTE*)pmsg ); 
	if( pmsg->wCmd == 0x0a ) 
	{ 
		//printf( "Code is %s\n", tmpBuffer ); 
	} 
	return ierr; 
} 
int GetMsg( MMSG * pMsg ) 
{ 
	char	tmpBuffer[1024]; 
	int ilen = 0; 
	if( g_MsgQueue.GetMsg( tmpBuffer )) 
	{ 
		ilen = strlen( tmpBuffer ); 
		if( tmpBuffer[ilen-1] == '!' ) 
		{ 
			tmpBuffer[ilen-1] = '\0'; 
		} 
		printf( "Msg: %s\n", tmpBuffer ); 
		if( tmpBuffer[1] == '+' ) 
		{ 
			tmpBuffer[6] = '\0'; 
			printf( "GetWords %s\n", tmpBuffer ); 
			if( stricmp( tmpBuffer, "#+GOOD" ) == 0 ) 
			{ 
				ActionOk(); 
			} 
			else if( stricmp( tmpBuffer, "#+FAIL" ) == 0 ) 
			{ 
				ActionFail(); 
			} 
			return 0; 
			 
		} 
		UnGameCode( &tmpBuffer[1], (BYTE*)pMsg ); 
		return 1;	 
	} 
	return 0; 
} 
int SetNoBlock( SOCKET s ) 
{ 
	unsigned long mode = 1; 
	if( ioctlsocket( s, FIONBIO, &mode ) == -1 ) 
		return 0; 
	return 1; 
} 
int RecvGateMsg( SOCKET s, MMSG * pmsg ) 
{ 
	char tmpBuffer[2048]; 
	char tmpBuffer2[2048]; 
	int ierr; 
	ierr = RecvString( s, tmpBuffer, 2048 ); 
	if( ierr == -1 ) 
	{ 
		return -1; 
	} 
	tmpBuffer[ierr-1] = '\0'; 
 
	UnGateCode( &tmpBuffer[1], tmpBuffer2 ); 
	ierr = strlen( tmpBuffer2 ); 
 
	if(tmpBuffer2[ierr-1] == '!' ) 
	{ 
		tmpBuffer2[ierr-1] = '\0'; 
	} 
	UnGameCode( &tmpBuffer2[1], (BYTE*)pmsg ); 
	return ierr; 
 
} 
int SendMsg( SOCKET s, MMSG * pmsg ) 
{ 
	char	tmpBuffer[2048]; 
	char	tmpBuffer2[2048]; 
	int msize = 0; 
	msize = strlen(pmsg->data ) + MSGHEADERSIZE; 
 
	CodeGameCode( (BYTE*)pmsg, msize, (BYTE*)tmpBuffer ); 
	sprintf( tmpBuffer2, "#%c%s!",g_msgflag, tmpBuffer ); 
	return SendString( s,tmpBuffer2 ); 
} 
 
int SendGateMsg( SOCKET s, MMSG * pmsg ) 
{ 
	char	tmpBuffer[2048]; 
	char	tmpBuffer2[2048]; 
	int msize = 0; 
	msize = strlen(pmsg->data ) + MSGHEADERSIZE; 
 
	CodeGameCode( (BYTE*)pmsg, msize, (BYTE*)tmpBuffer ); 
	sprintf( tmpBuffer2, "#%c%s!",g_msgflag, tmpBuffer ); 
	CodeGateCode( tmpBuffer2, tmpBuffer ); 
	sprintf( tmpBuffer2, "<%s>", tmpBuffer ); 
 
	return SendString( s, tmpBuffer2 ); 
} 
int SendWords( SOCKET  s , char * word ) 
{ 
	MMSG msg; 
	memset( &msg, 0, sizeof( MMSG )); 
	sprintf( msg.data, "#(%03d,%03d)-%s", g_pos_x, g_pos_y, word ); 
	msg.wCmd = 0xbd6; 
	int erri; 
	erri = SendMsg( s, &msg ); 
	return erri; 
} 
int TurnDirect( SOCKET s, int dir ) 
{ 
	MMSG msg; 
	char	tmpBuffer[2048]; 
	int erri; 
	memset( &msg, 0, sizeof( MMSG )); 
	//msg.dwFlag = 0x6000e; 
	msg.wa = g_pos_x; 
	msg.wb = g_pos_y; 
	msg.wCmd = 0xbc2; 
	msg.w2 = dir; 
	erri = SendMsg( s, &msg ); 
	if( erri == -1 ) 
		return -1; 
	erri = RecvString( s, tmpBuffer, 256 ); 
	if( erri == -1 ) 
		return 0; 
	//printf( "%s\n", tmpBuffer ); 
	tmpBuffer[6] = '\0'; 
	if( stricmp( &tmpBuffer[1] ,"+GOOD") == 0 ) 
	{ 
		//g_pos_x += xofs_walk[dir]; 
		//g_pos_y += yofs_walk[dir]; 
		return 1; 
	} 
	return 0; 
} 
int	xofs_walk[] = { 0, 1, 1, 1, 0, -1, -1, -1 }; 
int yofs_walk[] = { -1, -1, 0, 1, 1, 1, 0, -1 }; 
 
int Walk( SOCKET s, int dir ) 
{ 
	MMSG msg; 
	char	tmpBuffer[2048]; 
	int erri; 
	int tx,ty; 
	if( dir <0 || dir > 7 ) 
		return 0; 
	tx = g_pos_x + xofs_walk[dir]; 
	ty = g_pos_y + yofs_walk[dir]; 
	memset( &msg, 0, sizeof( MMSG )); 
	//msg.dwFlag = 0x6000e; 
	msg.wa = tx;//g_pos_x; 
	msg.wb = ty;//g_pos_y; 
	msg.wCmd = 0xbc3; 
	msg.w2 = dir; 
	erri = SendMsg( s, &msg ); 
	if( erri == -1 ) 
		return -1; 
	erri = RecvString( s, tmpBuffer, 256 ); 
	if( erri == -1 ) 
		return 0; 
//	printf( "%s\n", tmpBuffer ); 
	tmpBuffer[6] = '\0'; 
	if( stricmp( &tmpBuffer[1] ,"+GOOD") == 0 ) 
	{ 
		printf( "Good!!\n" ); 
		g_pos_x = tx;// xofs_walk[dir]; 
		g_pos_y = ty;//+= yofs_walk[dir]; 
		return 1; 
	} 
	return 0; 
} 
int Run( SOCKET s, int dir ) 
{ 
	MMSG msg; 
	char	tmpBuffer[2048]; 
	int erri; 
	int tx,ty; 
	if( dir <0 || dir > 7 ) 
		return 0; 
	tx = g_pos_x + (xofs_walk[dir]*2); 
	ty = g_pos_y + (yofs_walk[dir]*2); 
	memset( &msg, 0, sizeof( MMSG )); 
	msg.wa = tx;//g_pos_x; 
	msg.wb = ty;//g_pos_y; 
	msg.wCmd = 0xbc5; 
	msg.w2 = dir; 
	erri = SendMsg( s, &msg ); 
	if( erri == -1 ) 
		return 0; 
	g_LastAction.action = ACTION_RUN; 
	g_LastAction.x = tx; 
	g_LastAction.y = ty; 
	g_LastAction.dir = dir; 
	return 1; 
} 
int Attack( SOCKET s, int dir ) 
{ 
	MMSG msg; 
	char	tmpBuffer[2048]; 
	int erri; 
	int tx,ty; 
	if( dir <0 || dir > 7 ) 
		return 0; 
	//tx = g_pos_x + (xofs_walk[dir]*2); 
	//ty = g_pos_y + (yofs_walk[dir]*2); 
	memset( &msg, 0, sizeof( MMSG )); 
	//msg.dwFlag = 0x6000e; 
	msg.wa = g_pos_x; 
	msg.wb = g_pos_y; 
	msg.wCmd = 0xbc8; 
	msg.w2 = dir; 
	erri = SendMsg( s, &msg ); 
	if( erri == -1 ) 
		return -1; 
	erri = RecvString( s, tmpBuffer, 256 ); 
	if( erri == -1 ) 
		return 0; 
//	printf( "%s\n", tmpBuffer ); 
	tmpBuffer[6] = '\0'; 
	if( stricmp( &tmpBuffer[1] ,"+GOOD") == 0 ) 
	{ 
		printf( "Good!!\n" ); 
		return 1; 
	} 
	return 0; 
} 
 
int GetMsgInfo( SOCKET	s ) 
{ 
	char	tmpBuffer[2048]; 
	static char	tmpLeft[4096] = ""; 
	char	tmpMsg[2048]; 
	int	ierr = 0; 
	int iptr = 0; 
	int i = 0; 
	ierr = recv( s, tmpBuffer, 2048, 0 ); 
	if( ierr == -1 ) 
		return 0; 
	if( ierr > 0 ) 
	{ 
		tmpBuffer[ierr] = '\0'; 
		printf( "Recv:%s\n", tmpBuffer ); 
		printf( "Left:%s\n", tmpLeft ); 
		strcat( tmpLeft, tmpBuffer ); 
		for( i = 0;i < (int)strlen( tmpLeft) ;i ++ ) 
		{ 
			if( tmpLeft[i] == '*' ) 
				continue; 
			if( tmpLeft[i] == '#' ) 
			{ 
				iptr = i; 
			} 
			if( tmpLeft[i] == '!' ) 
			{ 
				memcpy( (void*)tmpMsg, (void*)&tmpLeft[iptr], i - iptr + 1 ); 
				tmpMsg[i-iptr+1] = '\0'; 
				if( !g_MsgQueue.PutMsg( tmpMsg ) ) 
				{ 
					break; 
				} 
//				printf( "Put msg: %s\n", tmpMsg ); 
				iptr = 0; 
			} 
		} 
		if( iptr > 0 ) 
		{ 
			memcpy( (void*)tmpBuffer, (void*)&tmpLeft[iptr], ierr - iptr ); 
			tmpBuffer[ierr - iptr] = '\0'; 
			strcpy( tmpLeft, tmpBuffer ); 
		} 
		else 
		{ 
			tmpLeft[0]='\0'; 
		} 
	} 
	return 1; 
} 
int GetMsgInfo2( char * s ) 
{ 
	char	tmpBuffer[2048]; 
	static char	tmpLeft[4096] = ""; 
	static BOOL	bLeft = FALSE; 
	char	tmpMsg[2048]; 
	int	ierr = 0; 
	int iptr = 0; 
	int i = 0; 
	//ierr = recv( s, tmpBuffer, 2048, 0 ); 
	ierr = strlen( s ); 
	if( ierr == -1 ) 
		return 0; 
	if( ierr > 0 ) 
	{ 
		tmpBuffer[ierr] = '\0'; 
		strcat( tmpLeft, s );//tmpBuffer ); 
		for( i = 0;i < ierr;i ++ ) 
		{ 
			if( tmpLeft[i] == '*' ) 
				continue; 
			if( tmpLeft[i] == '#' ) 
			{ 
				iptr = i; 
			} 
			if( tmpLeft[i] == '!' ) 
			{ 
				memcpy( (void*)tmpMsg, (void*)&tmpLeft[iptr], i - iptr + 1 ); 
				tmpMsg[i-iptr+1] = '\0'; 
				if( !g_MsgQueue.PutMsg( tmpMsg ) ) 
				{ 
					break; 
				} 
				iptr = 0; 
			} 
		} 
		if( iptr > 0 ) 
		{ 
			memcpy( (void*)tmpBuffer, (void*)&tmpLeft[iptr], ierr - iptr ); 
			tmpBuffer[ierr - iptr] = '\0'; 
			strcpy( tmpLeft, tmpBuffer ); 
		} 
		else 
		{ 
			tmpLeft[0] = '\0'; 
		} 
		printf( "%s\n" , tmpLeft); 
	} 
	return 1; 
} 
 
int HandleAppearMsg( MMSG * pmsg ) 
{ 
	char	tmpBuffer[2048]; 
	char	strs[200]; 
	UnNameCode( &pmsg->data[8],  tmpBuffer ); 
	printf( "%s 出现在坐标 %d, %d 处\n", tmpBuffer, pmsg->w1, pmsg->w2 ); 
	sprintf( strs, "%s 出现在坐标 %d, %d 处\n", tmpBuffer, pmsg->w1, pmsg->w2 ); 
	SendWords( (SOCKET)pmsg->dwFlag, strs ); 
	printf( "Name code is %s\n", pmsg->data ); 
	return 0; 
} 
int EnterGame( char * serverip, int port, char * charname, char * sid ) 
{ 
	LPHOSTENT m_pHost; 
	WSADATA m_wsaData; 
	int		m_SockFD; 
	struct	sockaddr_in ServAddr; 
	char	tmpBuffer[1024]; 
	char	tmpBuffer2[1024]; 
	MMSG		msg; 
	int msize = 0; 
	int mdir = 0; 
	int mmmtime = 0; 
	memset( &msg, 0, sizeof( MMSG )); 
 
	WSAStartup(MAKEWORD(2,2), &m_wsaData); 
 
	m_pHost = gethostbyname(serverip); 
 
	m_SockFD = 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); 
 
	printf( "正在连接游戏服务器...\n" ); 
	int erri = connect(m_SockFD, (struct sockaddr *)&ServAddr, sizeof(ServAddr)); 
	if( erri == -1) return 0; 
	printf( "游戏服务器连接成功!\n" ); 
	sprintf( tmpBuffer, "**%s/%s/%s/20020522/0", ACCOUNT, charname, sid ); 
	CodeGameCode( (BYTE*)tmpBuffer, strlen( tmpBuffer ), (BYTE*)tmpBuffer2 ); 
	sprintf( tmpBuffer, "#%c%s!", g_msgflag, tmpBuffer2 ); 
	printf( "验证用户合法性...\n", tmpBuffer ); 
	erri = SendString( m_SockFD, tmpBuffer ); 
	if( erri == -1 ) 
		return 0; 
	printf( "接收用户守则...\n" ); 
	erri = RecvMsg( m_SockFD, &msg ); 
	if( erri == -1 ) 
		return 0; 
	//printf( "%s\n", msg.data ); 
	erri = RecvString( m_SockFD, tmpBuffer, 2048 ); 
	if( erri > 0 ) 
	{ 
		printf( "%s\n", tmpBuffer ); 
	} 
	memset( &msg, 0, sizeof( MMSG )); 
 
	msg.wCmd = 0x3fa; 
	printf( "确认同意用户守则...\n"); 
	erri = SendMsg( m_SockFD, &msg ); 
	if( erri == -1 ) 
		return -1; 
 
	printf( "进入游戏!\n" ); 
	SetNoBlock( m_SockFD ); 
	int bflag = 0; 
	while( 1 ) 
	{ 
		Sleep( 600 ); 
		mmmtime ++; 
		GetMsgInfo( m_SockFD ); 
 
		while( GetMsg( &msg ))//RecvMsg( m_SockFD, &msg ); 
		{ 
		if( msg.wCmd == 0x33 ) 
		{ 
			printf( "人物出现在地图 %s.map 坐标 ( %d, %d )\n", msg.data ,msg.w1, msg.w2 ); 
			g_pos_x = msg.w1; 
			g_pos_y = msg.w2; 
		} 
		if( msg.wCmd == 0x36 ) 
		{ 
			strcpy( g_mapname, msg.data ); 
			printf( "Location at map: %s\n", msg.data ); 
			 
		} 
		if( msg.wCmd == 0x0a ) 
		{ 
			msg.dwFlag = m_SockFD; 
			HandleAppearMsg( &msg ); 
		} 
		printf( "%s\n", msg.data ); 
		} 
		//if( mdir == 6 ) 
		//	SendWords( m_SockFD, WORDS  ); 
		if( mmmtime > 50 ) 
		{ 
		if( CanDoAction()) 
		{ 
			printf( "跑步中!..\n" ); 
			SendWords( m_SockFD, WORDS ); 
			Run( m_SockFD, mdir ); 
		mdir ++; 
		if( mdir >= 8 ) 
			mdir = 0; 
		} 
		} 
		printf( "Pos: %d, %d\n", g_pos_x, g_pos_y ); 
		 
	} 
 
	closesocket(m_SockFD); 
	WSACleanup(); 
	return 1; 
} 
int SelChar( char * serverip, int port, char * sid ) 
{ 
	LPHOSTENT m_pHost; 
	WSADATA m_wsaData; 
	int		m_SockFD; 
	struct	sockaddr_in ServAddr; 
//	char	tmpBuffer[1024]; 
//	char	tmpBuffer2[1024]; 
	MMSG		msg; 
	int msize = 0; 
	memset( &msg, 0, sizeof( MMSG )); 
 
	WSAStartup(MAKEWORD(2,2), &m_wsaData); 
 
	m_pHost = gethostbyname(serverip); 
 
	m_SockFD = 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); 
 
	printf( "连接角色服务器...\n" ); 
	int erri = connect(m_SockFD, (struct sockaddr *)&ServAddr, sizeof(ServAddr)); 
	if( erri == -1) return 0; 
	printf( "角色服务器连接成功!\n" ); 
	printf( "验证用户SID\n" ); 
 
	msg.wCmd = 0x64; 
	sprintf( msg.data, "%s/%s", ACCOUNT, sid ); 
	//printf( "Test String is:%s\n", msg.data ); 
	erri = SendMsg( m_SockFD, &msg ); 
	if( erri == -1 ) 
		return 0; 
	erri = RecvMsg( m_SockFD, &msg ); 
	if( erri == -1 ) 
		return 0; 
	if( msg.wCmd != 0x208 ) 
		return 0; 
	printf( "角色列表:%s\n", msg.data ); 
 
	memset( &msg, 0, sizeof( MMSG )); 
	msg.wCmd = 0x67; 
	sprintf( msg.data, "%s/%s", ACCOUNT, "开福の名人" ); 
	erri = SendMsg( m_SockFD, &msg ); 
	if( erri == -1 ) 
		return 0; 
	erri = RecvMsg( m_SockFD, &msg ); 
	if( erri == -1 ) 
		return 0; 
	if( msg.wCmd != 0x20d ) 
	{ 
		return 0; 
	} 
	printf( "%s\n", msg.data ); 
	GetString( msg.data ); 
	EnterGame( g_StringList[0], atoi(g_StringList[1]), "开福の名人", sid ); 
 
	closesocket(m_SockFD); 
	WSACleanup(); 
	return 1; 
} 
 
int CrossGate( char * username, char * password, char * servername ) 
{ 
	LPHOSTENT m_pHost; 
	WSADATA m_wsaData; 
	int		m_SockFD; 
	struct	sockaddr_in ServAddr; 
	char	tmpBuffer[1024]; 
	char	tmpBuffer2[1024]; 
	MMSG		msg; 
	int msize = 0; 
	memset( &msg, 0, sizeof( MMSG )); 
 
	WSAStartup(MAKEWORD(2,2), &m_wsaData); 
 
	m_pHost = gethostbyname(CGIP); 
 
	m_SockFD = 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(7000); 
	 
	int erri = connect(m_SockFD, (struct sockaddr *)&ServAddr, sizeof(ServAddr)); 
	printf( "连接账号验证服务器...\n" ); 
	if( erri == -1) return 0; 
	printf( "服务器连接成功!\n" ); 
	erri = send( m_SockFD, "", 8, 0 ); 
	printf( "发送版本信息:%s\n", "" ); 
	if( erri == -1 ) 
	{ 
		printf( "Error occured!\n" ); 
		return 0; 
	} 
	erri = recv( m_SockFD, rcBuffer, 4096, 0 ); 
	if( erri == -1 ) 
	{ 
		return 0; 
	} 
	else 
	{ 
		printf("验证客户端合法性...\n" ); 
		//printf( "Get remote code: %s\n", rcBuffer ); 
		rcBuffer[erri-1] = '\0'; 
		UnGateCode( &rcBuffer[1], tmpBuffer ); 
		//printf( "%s\n", tmpBuffer ); 
		strcat( tmpBuffer, "/" ); 
		CodeGateCode( tmpBuffer, tmpBuffer2 ); 
		//printf( "%s\n", tmpBuffer2 ); 
		sprintf( tmpBuffer, "<%s>", tmpBuffer2 ); 
		//printf( "Gen local code: %s\n", tmpBuffer ); 
	} 
	erri = send( m_SockFD, tmpBuffer, strlen( tmpBuffer), 0 ); 
	if( erri == -1 ) 
		return 0; 
	erri = recv( m_SockFD, rcBuffer, 4096, 0 ); 
	if( erri == -1 ) 
		return 0; 
	else 
		rcBuffer[erri]  = '\0'; 
	printf( "%s\n", rcBuffer ); 
	if( stricmp( rcBuffer, "" ) == 0) 
	{ 
		printf( "验证通过,开始验证用户名和密码\n" ); 
	} 
	msg.wCmd = 0x7d1; 
	sprintf( msg.data, "%s/%s", ACCOUNT, PASSWORD ); 
	msize = MSGHEADERSIZE + strlen( msg.data ); 
	erri = 	SendGateMsg( m_SockFD, &msg ); 
	if( erri == -1 ) 
		return 0; 
	//printf( "Password sended!\n" ); 
	erri = RecvGateMsg( m_SockFD, &msg ); 
	if( erri == -1 ) 
		return 0; 
	if( msg.wCmd == 0x211 ) 
		printf( "验证通过!\n" ); 
	else 
		return 0; 
	msg.wCmd = 0x68; 
	strcpy( msg.data, servername ); 
	erri = SendGateMsg( m_SockFD, &msg ); 
	if( erri == -1 ) 
		return 0; 
	erri = RecvGateMsg( m_SockFD, &msg ); 
	if( erri == -1 ) 
		return 0; 
	if( msg.wCmd != 0x212 ) 
		return 0; 
	printf( "得到服务器地址:%s\n", msg.data ); 
 
	GetString( msg.data ); 
	//printf( "%s %s %s\n", g_StringList[0], g_StringList[1], g_StringList[2] ); 
	 
	SelChar( g_StringList[0], atoi( g_StringList[1]), g_StringList[2] ); 
 
	closesocket(m_SockFD); 
	WSACleanup(); 
	return 1; 
}