unsigned __stdcall CXXXChatRoomProcessor::ThreadFunc(void* lParam)
{
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}
ThreadParam *p = (ThreadParam*)lParam;
CXXXChatRoomProcessor *processor = (CXXXChatRoomProcessor *)p->obj;
processor->isRunThread = TRUE;
if(processor->m_socket->m_hSocket!=NULL)
{
processor->m_bIsConnected = true;
processor->OnCloseSocket();
}
processor->m_socket->SetProxy( processor->nProxyType, processor->ProxyHost, processor->ProxyPort,
processor->ProxyUser, processor->ProxyPass, processor->bUseSocks5Logon );
if(!processor->m_socket->create())
{
processor->OnConnect(-1);
return false;
}
TRACE("正在连接聊天服务器/n");
processor->m_socket->SetTimeOut(50000);
if(!processor->m_socket->Connect(p->addr,p->port))
{
processor->OnConnect(1);
return false;
}
processor->m_socket->KillTimeOut();
TRACE("连接聊天服务器完毕/n");
processor->m_bIsConnected = true;
processor->Active = true;
processor->OnConnect(0);
while(processor->isRunThread)
{
MSG msg;
Sleep(5);
if(::PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
processor->OnCloseSocket();
return true;
}
void CXXXChatRoomProcessor::Connect(char *svrAddr, unsigned short port)
{
isRunThread = FALSE;
pThreadParam.obj = this;
pThreadParam.addr = svrAddr;
pThreadParam.port = port;
HANDLE m_hThread = createThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunc, &pThreadParam, 0, NULL);
}
void CXXXChatRoomProcessor::OnConnect(int nErrorCode)
{
switch(nErrorCode)
{
case -1:
OnChatMessage("/n初始化socket错误! 请重试...",RGB(0,100,0));
break;
case 1:
{
KillTimer(EVENT_LOGIN_TEST);
KillTimer(EVENT_TRY_CONNECT);//停止
int c =WSAGetLastError();
m_socket->Close();
if(!bAutoConnect) //如果是自动尝试重新连接,不弹出对话框
{
CString err;
err.Format("/n连接聊天服务器失败,请重试! 错误代码:%d", c);//请检查网络连接是否正常!无法连接服务器,
SetTrayIcon(XXXX_DISCONNECT);
OnChatMessage(err,RGB(0,100,0));
}
bAutoConnect = false;
m_bIsConnected = false;
Active = false;
SetTrayIcon(XXXX_DISCONNECT);
}
break;
case 0: //如果连接成功
{
if(xxxx_conn==XXXX_GATESERVER)
{
if(m_bIsConnected)
{
std::string username = user;
std::string password = pass;
unsigned short clientversion =0x222;
LoginChatRoomPacket* packet = XXXPacketFactory::newLoginChatRoomPacket();
packet->setUserName(username);
std::string md5Ret;
getStringMD5Value(password.c_str(),md5Ret);
packet->setPassword(md5Ret);//password
packet->setClientVersion(clientversion);
char* buf = new char[packet->getPacketLength()];
XXXPacketFactory::toCharBuffer(packet,buf);
m_socket->Send(buf, packet->getPacketLength());
XXXPacketFactory::freePacket(packet);
delete[] buf;
//同时启动登录返回测试消息时间中断验证过程,如果10秒钟内没有消息返回,认为服务器那头有问题。同时提示登录超时
TRACE("正在登录服务器/n");
OnChatMessage("正在登录服务器...",RGB(0,100,0));
SetTimer(EVENT_LOGIN_TEST,30000,NULL);
}
}
else if (xxxx_conn==XXXX_SERVER)
{
//登录消息服务器
LoginInServer();
}
}
break;
}
}
{
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}
ThreadParam *p = (ThreadParam*)lParam;
CXXXChatRoomProcessor *processor = (CXXXChatRoomProcessor *)p->obj;
processor->isRunThread = TRUE;
if(processor->m_socket->m_hSocket!=NULL)
{
processor->m_bIsConnected = true;
processor->OnCloseSocket();
}
processor->m_socket->SetProxy( processor->nProxyType, processor->ProxyHost, processor->ProxyPort,
processor->ProxyUser, processor->ProxyPass, processor->bUseSocks5Logon );
if(!processor->m_socket->create())
{
processor->OnConnect(-1);
return false;
}
TRACE("正在连接聊天服务器/n");
processor->m_socket->SetTimeOut(50000);
if(!processor->m_socket->Connect(p->addr,p->port))
{
processor->OnConnect(1);
return false;
}
processor->m_socket->KillTimeOut();
TRACE("连接聊天服务器完毕/n");
processor->m_bIsConnected = true;
processor->Active = true;
processor->OnConnect(0);
while(processor->isRunThread)
{
MSG msg;
Sleep(5);
if(::PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
processor->OnCloseSocket();
return true;
}
void CXXXChatRoomProcessor::Connect(char *svrAddr, unsigned short port)
{
isRunThread = FALSE;
pThreadParam.obj = this;
pThreadParam.addr = svrAddr;
pThreadParam.port = port;
HANDLE m_hThread = createThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunc, &pThreadParam, 0, NULL);
}
void CXXXChatRoomProcessor::OnConnect(int nErrorCode)
{
switch(nErrorCode)
{
case -1:
OnChatMessage("/n初始化socket错误! 请重试...",RGB(0,100,0));
break;
case 1:
{
KillTimer(EVENT_LOGIN_TEST);
KillTimer(EVENT_TRY_CONNECT);//停止
int c =WSAGetLastError();
m_socket->Close();
if(!bAutoConnect) //如果是自动尝试重新连接,不弹出对话框
{
CString err;
err.Format("/n连接聊天服务器失败,请重试! 错误代码:%d", c);//请检查网络连接是否正常!无法连接服务器,
SetTrayIcon(XXXX_DISCONNECT);
OnChatMessage(err,RGB(0,100,0));
}
bAutoConnect = false;
m_bIsConnected = false;
Active = false;
SetTrayIcon(XXXX_DISCONNECT);
}
break;
case 0: //如果连接成功
{
if(xxxx_conn==XXXX_GATESERVER)
{
if(m_bIsConnected)
{
std::string username = user;
std::string password = pass;
unsigned short clientversion =0x222;
LoginChatRoomPacket* packet = XXXPacketFactory::newLoginChatRoomPacket();
packet->setUserName(username);
std::string md5Ret;
getStringMD5Value(password.c_str(),md5Ret);
packet->setPassword(md5Ret);//password
packet->setClientVersion(clientversion);
char* buf = new char[packet->getPacketLength()];
XXXPacketFactory::toCharBuffer(packet,buf);
m_socket->Send(buf, packet->getPacketLength());
XXXPacketFactory::freePacket(packet);
delete[] buf;
//同时启动登录返回测试消息时间中断验证过程,如果10秒钟内没有消息返回,认为服务器那头有问题。同时提示登录超时
TRACE("正在登录服务器/n");
OnChatMessage("正在登录服务器...",RGB(0,100,0));
SetTimer(EVENT_LOGIN_TEST,30000,NULL);
}
}
else if (xxxx_conn==XXXX_SERVER)
{
//登录消息服务器
LoginInServer();
}
}
break;
}
}