MirCore.cpp
上传用户:marco7834
上传日期:2010-02-24
资源大小:82k
文件大小:18k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. #pragma comment( lib, "ws2_32.lib" )
  2. #include <winsock2.h>
  3. #include <windowsx.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include "mircode.h"
  7. typedef struct
  8. {
  9. union
  10. {
  11. DWORD dwFlag;
  12. struct
  13. {
  14. WORD wa;
  15. WORD wb;
  16. };
  17. };
  18. WORD wCmd;
  19. WORD w1;
  20. WORD w2;
  21. WORD w3;
  22. char data[1024];
  23. }MMSG;
  24. #define CGIP "61.152.97.21"
  25. #define ACCOUNT "johndragon"
  26. #define PASSWORD "shifully"
  27. #define WORDS "各个姐姐弟弟妹妹们,你们好,我是机器人,请多关照!!"
  28. char g_msgflag = '1';
  29. char rcBuffer[4096];
  30. typedef char TSTRING[256];
  31. TSTRING g_StringList[20];
  32. int g_pos_x, g_pos_y;
  33. char g_mapname[256];
  34. #define MSGHEADERSIZE 12
  35. #define MSGLENGTH 1024
  36. #define MSGQUEUELEN 256
  37. typedef char TMSGLINE[MSGLENGTH];
  38. enum _action
  39. {
  40. ACTION_STAND,
  41. ACTION_WALK,
  42. ACTION_ATTACK,
  43. ACTION_RUN,
  44. ACTION_TRUN,
  45. };
  46. typedef struct
  47. {
  48. int x;
  49. int y;
  50. int dir;
  51. int action;
  52. }ACTION_LAST;
  53. ACTION_LAST g_LastAction = {0, 0, 0, 0 };
  54. class CMsgQueue  
  55. {
  56. public:
  57. CMsgQueue()
  58. {
  59. m_iGet = 0;
  60. m_iPut = 0;
  61. Clear();
  62. };
  63. virtual ~CMsgQueue()
  64. {
  65. Clear();
  66. };
  67. int NextPos( int now )
  68. {
  69. now++;
  70. if( now >= MSGQUEUELEN )
  71. now = 0;
  72. return now;
  73. }
  74. int PutMsg( char * pMsg )
  75. {
  76. int iNext = NextPos( m_iPut );
  77. if( pMsg == NULL )
  78. return 0;
  79. if( iNext == m_iGet )
  80. {
  81. return 0;
  82. }
  83. strcpy( m_Msgs[m_iPut], pMsg );
  84. m_iPut = iNext;
  85. return 1;
  86. };
  87. int GetMsg( char * pMsg )
  88. {
  89. if( m_iGet == m_iPut )
  90. return 0;
  91. strcpy( pMsg, m_Msgs[m_iGet] );
  92. // printf( "m_iPut = %d, m_iGet = %dn", m_iPut, m_iGet );
  93. m_iGet = NextPos( m_iGet );
  94. return 1;
  95. };
  96. int Clear()
  97. {
  98. memset( (void*)m_Msgs, 0, sizeof( TMSGLINE ) * MSGQUEUELEN );
  99. return 1;
  100. };
  101. private:
  102. TMSGLINE m_Msgs[MSGQUEUELEN];
  103. int m_iGet;
  104. int m_iPut;
  105. };
  106. CMsgQueue g_MsgQueue;
  107. HWND m_hSysLog = NULL;
  108. HWND m_hChatLog = NULL;
  109. HWND m_hMainDlg = NULL;
  110. int m_MaxLogLine = 100;
  111. BOOL InitMirCore( HWND hMainWnd, HWND hSysLog, HWND hChatLog, int MaxLogLine )
  112. {
  113. m_hSysLog = hSysLog;
  114. m_hChatLog = hChatLog;
  115. m_hMainDlg = hMainWnd;
  116. m_MaxLogLine = MaxLogLine;
  117. return TRUE;
  118. }
  119. void LogToList( HWND hList, char * line )
  120. {
  121. int cnt = 0;
  122. cnt = ListBox_GetCount( hList );
  123. if( cnt >= m_MaxLogLine )
  124. {
  125. ListBox_DeleteString( hList, 0 );
  126. cnt --;
  127. }
  128. ListBox_AddString( hList, line );
  129. ListBox_SetCurSel( hList, cnt );
  130. }
  131. void LogChat( char * line,... )
  132. {
  133. char szBuff[2048];
  134. va_list vl;
  135. va_start( vl, line );
  136. vsprintf( szBuff, line, vl );
  137. va_end( vl);
  138. LogToList( m_hChatLog, szBuff );
  139. }
  140. void LogSystem( char * line,... )
  141. {
  142. char szBuff[2048];
  143. va_list vl;
  144. va_start( vl, line );
  145. vsprintf( szBuff, line, vl );
  146. va_end( vl);
  147. LogToList( m_hSysLog, szBuff );
  148. }
  149. int ActionOk()
  150. {
  151. printf( "Action Ok!n" );
  152. switch( g_LastAction.action )
  153. {
  154. case ACTION_RUN:
  155. case ACTION_WALK:
  156. g_pos_x = g_LastAction.x;
  157. g_pos_y = g_LastAction.y;
  158. break;
  159. }
  160. g_LastAction.action = 0;
  161. return 1;
  162. }
  163. int ActionFail()
  164. {
  165. printf( "Action Fail!n" );
  166. g_LastAction.action = 0;
  167. return 1;
  168. }
  169. int CanDoAction()
  170. {
  171. if( g_LastAction.action == 0 )
  172. return 1;
  173. return 0;
  174. }
  175. int GetString( char * string )
  176. {
  177. int ilen = strlen( string );
  178. int i = 0;
  179. int cnt = 0;
  180. int sptr = 0;
  181. for( i =0;i < ilen;i ++ )
  182. {
  183. if( string[i] == '/' && i != 0 )
  184. {
  185. g_StringList[cnt][sptr] = '';
  186. sptr = 0;
  187. cnt++;
  188. }
  189. else
  190. {
  191. g_StringList[cnt][sptr] = string[i];
  192. sptr ++;
  193. }
  194. }
  195. if( sptr > 0 )
  196. {
  197. g_StringList[cnt][sptr] = '';
  198. cnt++;
  199. }
  200. return cnt;
  201. }
  202. int SendString( SOCKET s, char * string )
  203. {
  204. int ierr = 0;
  205. int ilen = strlen( string );
  206. // printf( "Send: %sn", string );
  207. ierr = send( s, string, strlen( string), 0 );
  208. if( ierr == ilen )
  209. {
  210. g_msgflag ++;
  211. if( g_msgflag > '9' )
  212. g_msgflag = '1';
  213. }
  214. return ierr;
  215. }
  216. int RecvString( SOCKET s, char * string, int maxlen )
  217. {
  218. int ierr = 0;
  219. char tmpBuffer[2048];
  220. ierr = recv( s, tmpBuffer, 2048, 0 );
  221. if( ierr !=- 1)
  222. {
  223. if( tmpBuffer[0] == '*' )
  224. {
  225. strcpy( string, &tmpBuffer[1]);
  226. ierr --;
  227. }
  228. else
  229. {
  230. strcpy( string, tmpBuffer );
  231. }
  232. string[ierr] = '';
  233. // printf( "Recv:%sn", string );
  234. }
  235. return ierr;
  236. }
  237. int RecvMsg( SOCKET s, MMSG * pmsg )
  238. {
  239. char tmpBuffer[2048];
  240. // char tmpBuffer2[2048];
  241. int ierr;
  242. ierr = RecvString( s, tmpBuffer, 2048 );
  243. if( ierr == -1 )
  244. {
  245. return -1;
  246. }
  247. if(tmpBuffer[ierr-1] == '!' )
  248. {
  249. tmpBuffer[ierr-1] = '';
  250. }
  251. UnGameCode( &tmpBuffer[1], (BYTE*)pmsg );
  252. if( pmsg->wCmd == 0x0a )
  253. {
  254. //printf( "Code is %sn", tmpBuffer );
  255. }
  256. return ierr;
  257. }
  258. int GetMsg( MMSG * pMsg )
  259. {
  260. char tmpBuffer[1024];
  261. int ilen = 0;
  262. if( g_MsgQueue.GetMsg( tmpBuffer ))
  263. {
  264. ilen = strlen( tmpBuffer );
  265. if( tmpBuffer[ilen-1] == '!' )
  266. {
  267. tmpBuffer[ilen-1] = '';
  268. }
  269. printf( "Msg: %sn", tmpBuffer );
  270. if( tmpBuffer[1] == '+' )
  271. {
  272. tmpBuffer[6] = '';
  273. printf( "GetWords %sn", tmpBuffer );
  274. if( stricmp( tmpBuffer, "#+GOOD" ) == 0 )
  275. {
  276. ActionOk();
  277. }
  278. else if( stricmp( tmpBuffer, "#+FAIL" ) == 0 )
  279. {
  280. ActionFail();
  281. }
  282. return 0;
  283. }
  284. UnGameCode( &tmpBuffer[1], (BYTE*)pMsg );
  285. return 1;
  286. }
  287. return 0;
  288. }
  289. int SetNoBlock( SOCKET s )
  290. {
  291. unsigned long mode = 1;
  292. if( ioctlsocket( s, FIONBIO, &mode ) == -1 )
  293. return 0;
  294. return 1;
  295. }
  296. int RecvGateMsg( SOCKET s, MMSG * pmsg )
  297. {
  298. char tmpBuffer[2048];
  299. char tmpBuffer2[2048];
  300. int ierr;
  301. ierr = RecvString( s, tmpBuffer, 2048 );
  302. if( ierr == -1 )
  303. {
  304. return -1;
  305. }
  306. tmpBuffer[ierr-1] = '';
  307. UnGateCode( &tmpBuffer[1], tmpBuffer2 );
  308. ierr = strlen( tmpBuffer2 );
  309. if(tmpBuffer2[ierr-1] == '!' )
  310. {
  311. tmpBuffer2[ierr-1] = '';
  312. }
  313. UnGameCode( &tmpBuffer2[1], (BYTE*)pmsg );
  314. return ierr;
  315. }
  316. int SendMsg( SOCKET s, MMSG * pmsg )
  317. {
  318. char tmpBuffer[2048];
  319. char tmpBuffer2[2048];
  320. int msize = 0;
  321. msize = strlen(pmsg->data ) + MSGHEADERSIZE;
  322. CodeGameCode( (BYTE*)pmsg, msize, (BYTE*)tmpBuffer );
  323. sprintf( tmpBuffer2, "#%c%s!",g_msgflag, tmpBuffer );
  324. return SendString( s,tmpBuffer2 );
  325. }
  326. int SendGateMsg( SOCKET s, MMSG * pmsg )
  327. {
  328. char tmpBuffer[2048];
  329. char tmpBuffer2[2048];
  330. int msize = 0;
  331. msize = strlen(pmsg->data ) + MSGHEADERSIZE;
  332. CodeGameCode( (BYTE*)pmsg, msize, (BYTE*)tmpBuffer );
  333. sprintf( tmpBuffer2, "#%c%s!",g_msgflag, tmpBuffer );
  334. CodeGateCode( tmpBuffer2, tmpBuffer );
  335. sprintf( tmpBuffer2, "<%s>", tmpBuffer );
  336. return SendString( s, tmpBuffer2 );
  337. }
  338. int SendWords( SOCKET  s , char * word )
  339. {
  340. MMSG msg;
  341. memset( &msg, 0, sizeof( MMSG ));
  342. sprintf( msg.data, "#(%03d,%03d)-%s", g_pos_x, g_pos_y, word );
  343. msg.wCmd = 0xbd6;
  344. int erri;
  345. erri = SendMsg( s, &msg );
  346. return erri;
  347. }
  348. int TurnDirect( SOCKET s, int dir )
  349. {
  350. MMSG msg;
  351. char tmpBuffer[2048];
  352. int erri;
  353. memset( &msg, 0, sizeof( MMSG ));
  354. //msg.dwFlag = 0x6000e;
  355. msg.wa = g_pos_x;
  356. msg.wb = g_pos_y;
  357. msg.wCmd = 0xbc2;
  358. msg.w2 = dir;
  359. erri = SendMsg( s, &msg );
  360. if( erri == -1 )
  361. return -1;
  362. erri = RecvString( s, tmpBuffer, 256 );
  363. if( erri == -1 )
  364. return 0;
  365. //printf( "%sn", tmpBuffer );
  366. tmpBuffer[6] = '';
  367. if( stricmp( &tmpBuffer[1] ,"+GOOD") == 0 )
  368. {
  369. //g_pos_x += xofs_walk[dir];
  370. //g_pos_y += yofs_walk[dir];
  371. return 1;
  372. }
  373. return 0;
  374. }
  375. int xofs_walk[] = { 0, 1, 1, 1, 0, -1, -1, -1 };
  376. int yofs_walk[] = { -1, -1, 0, 1, 1, 1, 0, -1 };
  377. int Walk( SOCKET s, int dir )
  378. {
  379. MMSG msg;
  380. char tmpBuffer[2048];
  381. int erri;
  382. int tx,ty;
  383. if( dir <0 || dir > 7 )
  384. return 0;
  385. tx = g_pos_x + xofs_walk[dir];
  386. ty = g_pos_y + yofs_walk[dir];
  387. memset( &msg, 0, sizeof( MMSG ));
  388. //msg.dwFlag = 0x6000e;
  389. msg.wa = tx;//g_pos_x;
  390. msg.wb = ty;//g_pos_y;
  391. msg.wCmd = 0xbc3;
  392. msg.w2 = dir;
  393. erri = SendMsg( s, &msg );
  394. if( erri == -1 )
  395. return -1;
  396. erri = RecvString( s, tmpBuffer, 256 );
  397. if( erri == -1 )
  398. return 0;
  399. // printf( "%sn", tmpBuffer );
  400. tmpBuffer[6] = '';
  401. if( stricmp( &tmpBuffer[1] ,"+GOOD") == 0 )
  402. {
  403. printf( "Good!!n" );
  404. g_pos_x = tx;// xofs_walk[dir];
  405. g_pos_y = ty;//+= yofs_walk[dir];
  406. return 1;
  407. }
  408. return 0;
  409. }
  410. int Run( SOCKET s, int dir )
  411. {
  412. MMSG msg;
  413. char tmpBuffer[2048];
  414. int erri;
  415. int tx,ty;
  416. if( dir <0 || dir > 7 )
  417. return 0;
  418. tx = g_pos_x + (xofs_walk[dir]*2);
  419. ty = g_pos_y + (yofs_walk[dir]*2);
  420. memset( &msg, 0, sizeof( MMSG ));
  421. msg.wa = tx;//g_pos_x;
  422. msg.wb = ty;//g_pos_y;
  423. msg.wCmd = 0xbc5;
  424. msg.w2 = dir;
  425. erri = SendMsg( s, &msg );
  426. if( erri == -1 )
  427. return 0;
  428. g_LastAction.action = ACTION_RUN;
  429. g_LastAction.x = tx;
  430. g_LastAction.y = ty;
  431. g_LastAction.dir = dir;
  432. return 1;
  433. }
  434. int Attack( SOCKET s, int dir )
  435. {
  436. MMSG msg;
  437. char tmpBuffer[2048];
  438. int erri;
  439. int tx,ty;
  440. if( dir <0 || dir > 7 )
  441. return 0;
  442. //tx = g_pos_x + (xofs_walk[dir]*2);
  443. //ty = g_pos_y + (yofs_walk[dir]*2);
  444. memset( &msg, 0, sizeof( MMSG ));
  445. //msg.dwFlag = 0x6000e;
  446. msg.wa = g_pos_x;
  447. msg.wb = g_pos_y;
  448. msg.wCmd = 0xbc8;
  449. msg.w2 = dir;
  450. erri = SendMsg( s, &msg );
  451. if( erri == -1 )
  452. return -1;
  453. erri = RecvString( s, tmpBuffer, 256 );
  454. if( erri == -1 )
  455. return 0;
  456. // printf( "%sn", tmpBuffer );
  457. tmpBuffer[6] = '';
  458. if( stricmp( &tmpBuffer[1] ,"+GOOD") == 0 )
  459. {
  460. printf( "Good!!n" );
  461. return 1;
  462. }
  463. return 0;
  464. }
  465. int GetMsgInfo( SOCKET s )
  466. {
  467. char tmpBuffer[2048];
  468. static char tmpLeft[4096] = "";
  469. char tmpMsg[2048];
  470. int ierr = 0;
  471. int iptr = 0;
  472. int i = 0;
  473. ierr = recv( s, tmpBuffer, 2048, 0 );
  474. if( ierr == -1 )
  475. return 0;
  476. if( ierr > 0 )
  477. {
  478. tmpBuffer[ierr] = '';
  479. printf( "Recv:%sn", tmpBuffer );
  480. printf( "Left:%sn", tmpLeft );
  481. strcat( tmpLeft, tmpBuffer );
  482. for( i = 0;i < (int)strlen( tmpLeft) ;i ++ )
  483. {
  484. if( tmpLeft[i] == '*' )
  485. continue;
  486. if( tmpLeft[i] == '#' )
  487. {
  488. iptr = i;
  489. }
  490. if( tmpLeft[i] == '!' )
  491. {
  492. memcpy( (void*)tmpMsg, (void*)&tmpLeft[iptr], i - iptr + 1 );
  493. tmpMsg[i-iptr+1] = '';
  494. if( !g_MsgQueue.PutMsg( tmpMsg ) )
  495. {
  496. break;
  497. }
  498. // printf( "Put msg: %sn", tmpMsg );
  499. iptr = 0;
  500. }
  501. }
  502. if( iptr > 0 )
  503. {
  504. memcpy( (void*)tmpBuffer, (void*)&tmpLeft[iptr], ierr - iptr );
  505. tmpBuffer[ierr - iptr] = '';
  506. strcpy( tmpLeft, tmpBuffer );
  507. }
  508. else
  509. {
  510. tmpLeft[0]='';
  511. }
  512. }
  513. return 1;
  514. }
  515. int GetMsgInfo2( char * s )
  516. {
  517. char tmpBuffer[2048];
  518. static char tmpLeft[4096] = "";
  519. static BOOL bLeft = FALSE;
  520. char tmpMsg[2048];
  521. int ierr = 0;
  522. int iptr = 0;
  523. int i = 0;
  524. //ierr = recv( s, tmpBuffer, 2048, 0 );
  525. ierr = strlen( s );
  526. if( ierr == -1 )
  527. return 0;
  528. if( ierr > 0 )
  529. {
  530. tmpBuffer[ierr] = '';
  531. strcat( tmpLeft, s );//tmpBuffer );
  532. for( i = 0;i < ierr;i ++ )
  533. {
  534. if( tmpLeft[i] == '*' )
  535. continue;
  536. if( tmpLeft[i] == '#' )
  537. {
  538. iptr = i;
  539. }
  540. if( tmpLeft[i] == '!' )
  541. {
  542. memcpy( (void*)tmpMsg, (void*)&tmpLeft[iptr], i - iptr + 1 );
  543. tmpMsg[i-iptr+1] = '';
  544. if( !g_MsgQueue.PutMsg( tmpMsg ) )
  545. {
  546. break;
  547. }
  548. iptr = 0;
  549. }
  550. }
  551. if( iptr > 0 )
  552. {
  553. memcpy( (void*)tmpBuffer, (void*)&tmpLeft[iptr], ierr - iptr );
  554. tmpBuffer[ierr - iptr] = '';
  555. strcpy( tmpLeft, tmpBuffer );
  556. }
  557. else
  558. {
  559. tmpLeft[0] = '';
  560. }
  561. printf( "%sn" , tmpLeft);
  562. }
  563. return 1;
  564. }
  565. int HandleAppearMsg( MMSG * pmsg )
  566. {
  567. char tmpBuffer[2048];
  568. char strs[200];
  569. UnNameCode( &pmsg->data[8],  tmpBuffer );
  570. printf( "%s 出现在坐标 %d, %d 处n", tmpBuffer, pmsg->w1, pmsg->w2 );
  571. sprintf( strs, "%s 出现在坐标 %d, %d 处n", tmpBuffer, pmsg->w1, pmsg->w2 );
  572. SendWords( (SOCKET)pmsg->dwFlag, strs );
  573. printf( "Name code is %sn", pmsg->data );
  574. return 0;
  575. }
  576. int EnterGame( char * serverip, int port, char * charname, char * sid )
  577. {
  578. LPHOSTENT m_pHost;
  579. WSADATA m_wsaData;
  580. int m_SockFD;
  581. struct sockaddr_in ServAddr;
  582. char tmpBuffer[1024];
  583. char tmpBuffer2[1024];
  584. MMSG msg;
  585. int msize = 0;
  586. int mdir = 0;
  587. int mmmtime = 0;
  588. memset( &msg, 0, sizeof( MMSG ));
  589. WSAStartup(MAKEWORD(2,2), &m_wsaData);
  590. m_pHost = gethostbyname(serverip);
  591. m_SockFD = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  592. ServAddr.sin_family = AF_INET;
  593. ServAddr.sin_addr.s_addr = *(ULONG *)m_pHost->h_addr_list[0];
  594. ServAddr.sin_port = htons(port);
  595. printf( "正在连接游戏服务器...n" );
  596. int erri = connect(m_SockFD, (struct sockaddr *)&ServAddr, sizeof(ServAddr));
  597. if( erri == -1) return 0;
  598. printf( "游戏服务器连接成功!n" );
  599. sprintf( tmpBuffer, "**%s/%s/%s/20020522/0", ACCOUNT, charname, sid );
  600. CodeGameCode( (BYTE*)tmpBuffer, strlen( tmpBuffer ), (BYTE*)tmpBuffer2 );
  601. sprintf( tmpBuffer, "#%c%s!", g_msgflag, tmpBuffer2 );
  602. printf( "验证用户合法性...n", tmpBuffer );
  603. erri = SendString( m_SockFD, tmpBuffer );
  604. if( erri == -1 )
  605. return 0;
  606. printf( "接收用户守则...n" );
  607. erri = RecvMsg( m_SockFD, &msg );
  608. if( erri == -1 )
  609. return 0;
  610. //printf( "%sn", msg.data );
  611. erri = RecvString( m_SockFD, tmpBuffer, 2048 );
  612. if( erri > 0 )
  613. {
  614. printf( "%sn", tmpBuffer );
  615. }
  616. memset( &msg, 0, sizeof( MMSG ));
  617. msg.wCmd = 0x3fa;
  618. printf( "确认同意用户守则...n");
  619. erri = SendMsg( m_SockFD, &msg );
  620. if( erri == -1 )
  621. return -1;
  622. printf( "进入游戏!n" );
  623. SetNoBlock( m_SockFD );
  624. int bflag = 0;
  625. while( 1 )
  626. {
  627. Sleep( 600 );
  628. mmmtime ++;
  629. GetMsgInfo( m_SockFD );
  630. while( GetMsg( &msg ))//RecvMsg( m_SockFD, &msg );
  631. {
  632. if( msg.wCmd == 0x33 )
  633. {
  634. printf( "人物出现在地图 %s.map 坐标 ( %d, %d )n", msg.data ,msg.w1, msg.w2 );
  635. g_pos_x = msg.w1;
  636. g_pos_y = msg.w2;
  637. }
  638. if( msg.wCmd == 0x36 )
  639. {
  640. strcpy( g_mapname, msg.data );
  641. printf( "Location at map: %sn", msg.data );
  642. }
  643. if( msg.wCmd == 0x0a )
  644. {
  645. msg.dwFlag = m_SockFD;
  646. HandleAppearMsg( &msg );
  647. }
  648. printf( "%sn", msg.data );
  649. }
  650. //if( mdir == 6 )
  651. // SendWords( m_SockFD, WORDS  );
  652. if( mmmtime > 50 )
  653. {
  654. if( CanDoAction())
  655. {
  656. printf( "跑步中!..n" );
  657. SendWords( m_SockFD, WORDS );
  658. Run( m_SockFD, mdir );
  659. mdir ++;
  660. if( mdir >= 8 )
  661. mdir = 0;
  662. }
  663. }
  664. printf( "Pos: %d, %dn", g_pos_x, g_pos_y );
  665. }
  666. closesocket(m_SockFD);
  667. WSACleanup();
  668. return 1;
  669. }
  670. int SelChar( char * serverip, int port, char * sid )
  671. {
  672. LPHOSTENT m_pHost;
  673. WSADATA m_wsaData;
  674. int m_SockFD;
  675. struct sockaddr_in ServAddr;
  676. // char tmpBuffer[1024];
  677. // char tmpBuffer2[1024];
  678. MMSG msg;
  679. int msize = 0;
  680. memset( &msg, 0, sizeof( MMSG ));
  681. WSAStartup(MAKEWORD(2,2), &m_wsaData);
  682. m_pHost = gethostbyname(serverip);
  683. m_SockFD = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  684. ServAddr.sin_family = AF_INET;
  685. ServAddr.sin_addr.s_addr = *(ULONG *)m_pHost->h_addr_list[0];
  686. ServAddr.sin_port = htons(port);
  687. printf( "连接角色服务器...n" );
  688. int erri = connect(m_SockFD, (struct sockaddr *)&ServAddr, sizeof(ServAddr));
  689. if( erri == -1) return 0;
  690. printf( "角色服务器连接成功!n" );
  691. printf( "验证用户SIDn" );
  692. msg.wCmd = 0x64;
  693. sprintf( msg.data, "%s/%s", ACCOUNT, sid );
  694. //printf( "Test String is:%sn", msg.data );
  695. erri = SendMsg( m_SockFD, &msg );
  696. if( erri == -1 )
  697. return 0;
  698. erri = RecvMsg( m_SockFD, &msg );
  699. if( erri == -1 )
  700. return 0;
  701. if( msg.wCmd != 0x208 )
  702. return 0;
  703. printf( "角色列表:%sn", msg.data );
  704. memset( &msg, 0, sizeof( MMSG ));
  705. msg.wCmd = 0x67;
  706. sprintf( msg.data, "%s/%s", ACCOUNT, "开福の名人" );
  707. erri = SendMsg( m_SockFD, &msg );
  708. if( erri == -1 )
  709. return 0;
  710. erri = RecvMsg( m_SockFD, &msg );
  711. if( erri == -1 )
  712. return 0;
  713. if( msg.wCmd != 0x20d )
  714. {
  715. return 0;
  716. }
  717. printf( "%sn", msg.data );
  718. GetString( msg.data );
  719. EnterGame( g_StringList[0], atoi(g_StringList[1]), "开福の名人", sid );
  720. closesocket(m_SockFD);
  721. WSACleanup();
  722. return 1;
  723. }
  724. int CrossGate( char * username, char * password, char * servername )
  725. {
  726. LPHOSTENT m_pHost;
  727. WSADATA m_wsaData;
  728. int m_SockFD;
  729. struct sockaddr_in ServAddr;
  730. char tmpBuffer[1024];
  731. char tmpBuffer2[1024];
  732. MMSG msg;
  733. int msize = 0;
  734. memset( &msg, 0, sizeof( MMSG ));
  735. WSAStartup(MAKEWORD(2,2), &m_wsaData);
  736. m_pHost = gethostbyname(CGIP);
  737. m_SockFD = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  738. ServAddr.sin_family = AF_INET;
  739. ServAddr.sin_addr.s_addr = *(ULONG *)m_pHost->h_addr_list[0];
  740. ServAddr.sin_port = htons(7000);
  741. int erri = connect(m_SockFD, (struct sockaddr *)&ServAddr, sizeof(ServAddr));
  742. printf( "连接账号验证服务器...n" );
  743. if( erri == -1) return 0;
  744. printf( "服务器连接成功!n" );
  745. erri = send( m_SockFD, "<mir152>", 8, 0 );
  746. printf( "发送版本信息:%sn", "<mir152>" );
  747. if( erri == -1 )
  748. {
  749. printf( "Error occured!n" );
  750. return 0;
  751. }
  752. erri = recv( m_SockFD, rcBuffer, 4096, 0 );
  753. if( erri == -1 )
  754. {
  755. return 0;
  756. }
  757. else
  758. {
  759. printf("验证客户端合法性...n" );
  760. //printf( "Get remote code: %sn", rcBuffer );
  761. rcBuffer[erri-1] = '';
  762. UnGateCode( &rcBuffer[1], tmpBuffer );
  763. //printf( "%sn", tmpBuffer );
  764. strcat( tmpBuffer, "/" );
  765. CodeGateCode( tmpBuffer, tmpBuffer2 );
  766. //printf( "%sn", tmpBuffer2 );
  767. sprintf( tmpBuffer, "<%s>", tmpBuffer2 );
  768. //printf( "Gen local code: %sn", tmpBuffer );
  769. }
  770. erri = send( m_SockFD, tmpBuffer, strlen( tmpBuffer), 0 );
  771. if( erri == -1 )
  772. return 0;
  773. erri = recv( m_SockFD, rcBuffer, 4096, 0 );
  774. if( erri == -1 )
  775. return 0;
  776. else
  777. rcBuffer[erri]  = '';
  778. printf( "%sn", rcBuffer );
  779. if( stricmp( rcBuffer, "<pass>" ) == 0)
  780. {
  781. printf( "验证通过,开始验证用户名和密码n" );
  782. }
  783. msg.wCmd = 0x7d1;
  784. sprintf( msg.data, "%s/%s", ACCOUNT, PASSWORD );
  785. msize = MSGHEADERSIZE + strlen( msg.data );
  786. erri =  SendGateMsg( m_SockFD, &msg );
  787. if( erri == -1 )
  788. return 0;
  789. //printf( "Password sended!n" );
  790. erri = RecvGateMsg( m_SockFD, &msg );
  791. if( erri == -1 )
  792. return 0;
  793. if( msg.wCmd == 0x211 )
  794. printf( "验证通过!n" );
  795. else
  796. return 0;
  797. msg.wCmd = 0x68;
  798. strcpy( msg.data, servername );
  799. erri = SendGateMsg( m_SockFD, &msg );
  800. if( erri == -1 )
  801. return 0;
  802. erri = RecvGateMsg( m_SockFD, &msg );
  803. if( erri == -1 )
  804. return 0;
  805. if( msg.wCmd != 0x212 )
  806. return 0;
  807. printf( "得到服务器地址:%sn", msg.data );
  808. GetString( msg.data );
  809. //printf( "%s %s %sn", g_StringList[0], g_StringList[1], g_StringList[2] );
  810. SelChar( g_StringList[0], atoi( g_StringList[1]), g_StringList[2] );
  811. closesocket(m_SockFD);
  812. WSACleanup();
  813. return 1;
  814. }