?? eflow.cpp
字號:
/**
* 協(xié)議交互
*/
#include "stdafx.h"
#include <string>
#include "crypt.h"
#include "md5.h"
#include <stdlib.h>
#include <time.h>
#include "packet.h"
#include "options.h"
#include "network.h"
#include <windows.h>
#include "debug.h"
static HANDLE m_stop_event = NULL;
int eflow_init(void)
{
srand(time(NULL));
options_init();
if ( network_init() < 0 )
{
fprintf(stderr,"network_init failed\n");
return -1;
}
m_stop_event = CreateEvent( 0, FALSE, FALSE, 0 );
return 0;
}
int eflow_exit(void)
{
network_exit();
options_exit();
if (m_stop_event)
{
CloseHandle(m_stop_event);
m_stop_event = NULL;
}
return 0;
}
int eflow_loop(void)
{
int i,len;
unsigned char buf[512];
//DebugBreak();
login:
/**
* login 請求回應(yīng)報文的時間一定要足夠長。不然,假如發(fā)出 5
* 個請求后收到了一個回應(yīng)報文,那么立刻使用里面的 session id
* 并 break。但是,server 可能會繼續(xù)前面 5 個報文中后收到
* 的報文,并向我們發(fā)送新 session id。這導(dǎo)致 sid 不一致。
*/
g_options.recv_timeout = 30;
while (1)
{
len = packet_login(buf,sizeof(buf));
if ( network_send(buf,len) == len )
{
len = network_recv(buf,sizeof(buf));
if (len > 0x18)
{
decrypt(buf,len);
if (buf[0] == 2 && buf[0x12] == 3 && buf[0x13] == 3 && buf[0x14] == 1 && buf[0x15] == 8)
{
g_options.sesslen = buf[0x16];
if ( g_options.session )
free(g_options.session);
g_options.session = (char *)malloc(g_options.sesslen+1);
memcpy(g_options.session,buf+0x17,g_options.sesslen);
g_options.session[g_options.sesslen] = '\0';
debug("Session ID = [%s]\n",g_options.session);
break;
}
}
}
/// sleep 一段時間,并給 SCM 或 用戶一個終止 loop 的機會。
if ( WaitForSingleObject(m_stop_event, g_options.login_wait ) == WAIT_OBJECT_0 )
{
return 0;
}
}
i = 0;
g_options.recv_timeout = 5;
while (1)
{
/// sleep 一段時間,并給 SCM 或 用戶一個終止 loop 的機會。
/// 只所以放在循環(huán)開始位置是避免 login 成功后立刻就發(fā)送 ping 包。
if ( WaitForSingleObject(m_stop_event, g_options.ping_wait ) == WAIT_OBJECT_0 )
{
return 0;
}
len = packet_ping(buf,sizeof(buf));
if ( network_send(buf,len) == len )
{
len = network_recv(buf,sizeof(buf));
if (len > 0x18)
{
decrypt(buf,len);
if (buf[0] == 4 && buf[0x12] == 3 && buf[0x13] == 3 && buf[0x14] == 1)
{
debug("pong\n");
i = 0;
}
}
}
i++;
if ( i > 10 )
{
/// 如果 10*(recv_timeout + ping_wait/1000) 秒后沒收到 pong 包,重新 login
debug("relogin!\n");
goto login;
}
}
return 0;
}
/**
* 被 SCM 或 Ctrl_Handler 調(diào)用來指示 eflow_loop 應(yīng)該終止循環(huán)
*/
int eflow_stop(void)
{
SetEvent(m_stop_event);
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -