spgamedlg.cpp
来自「SP短消息平台」· C++ 代码 · 共 775 行 · 第 1/2 页
CPP
775 行
return TRUE;
}
BOOL CSPGameDlg::OnClose ()
{
this->GetDlgItem (IDC_CONNECTGATEWAY)->EnableWindow(TRUE);
this->GetDlgItem (IDC_DISCONNECTGATEWAY)->EnableWindow(FALSE);
this->GetDlgItem (IDC_SENDMESSAGE)->EnableWindow(FALSE);
closesocket (m_Socket);
return TRUE;
}
BOOL CSPGameDlg::OnConnect ()
{
return TRUE;
}
BOOL CSPGameDlg::OnRead ()
{
DWORD dwSize = 0;
int nRet = ioctlsocket(m_Socket, FIONREAD, &dwSize);
if (nRet == SOCKET_ERROR)//接收出错
return false;
if (dwSize == 0)//无数据接收
return true;
char *pData = new char[dwSize+1];
ZeroMemory (pData, sizeof(pData));
int nRead = recv(m_Socket, pData, dwSize, 0);
if (nRead == SOCKET_ERROR)
return false;
pData[dwSize] = '\0';
CString strRecvPacket; //接收到的报文
strRecvPacket = pData;
// CString strParsePacket;//需要解析的报文,当前面有半个报文的时候能用上
if (strRecvPacket.GetLength () == 0)
return true;
delete [] pData;
return false;
return TRUE;
}
unsigned CSPGameDlg::SendThreadProc (LPVOID lParam)
{
CSPGameDlg* pThis = (CSPGameDlg*)lParam;
//SEND_DEQUE SendDeque;
CString strSendData;
while (TRUE)
{
if (g_bExitThread)
break;
if (SendBuffer.empty ())
{
Sleep(100);
continue;
}
if (!pThis->m_bConnected)
{
pThis->InitNetwork ();
continue;
}
EnterCriticalSection(&pThis->cs_SendBuffer);
strSendData = SendBuffer.front ();
SendBuffer.pop_front ();
LeaveCriticalSection(&pThis->cs_SendBuffer);
if (strSendData.GetLength () == 0)
return 0;
//pThis->SendDataGateway (strSendData);
}
return 1;
}
unsigned CSPGameDlg::RecvThreadProc (LPVOID lParam)
{
CSPGameDlg* pThis = (CSPGameDlg*)lParam;
CString strRecvData;
while (TRUE)
{
if (g_bExitThread)
break;
if (RecvBuffer.empty ())
{
Sleep(100);
continue;
}
EnterCriticalSection(&pThis->cs_RecvBuffer);
strRecvData = RecvBuffer.front ();
RecvBuffer.pop_front ();
LeaveCriticalSection(&pThis->cs_RecvBuffer);
ParseData(strRecvData);
//处理具体的数据
}
return 1;
}
CString CSPGameDlg::GetMsgSerialNumber ()
{
CString strReturn;
strReturn = m_strNodeID;
CString strTime;
CTime t = CTime::GetCurrentTime ();
strTime.Format ("%d%d%d%d%d", t.GetMonth (), t.GetDay (), t.GetHour (), t.GetMinute (), t.GetSecond ());
strReturn += strTime;
CString strT;
strT.Format ("%d", m_nMsgNumber);
strReturn += strT;
return strReturn;
}
VOID ParseData(CString strRecvData)
{
CString strOperatorCode[10] =
{
"Login","TimePollSocket","Register","ServerInit", "DealSendErrorClient",
"Heartbeat", "AddMoney"
};//命令操作代码
/*
int i;
char * szToken;
char * szMsg;
char szTempMsg[8192];//要传递给解包函数用的字符串
memset(szTempMsg, 0, sizeof(szTempMsg));
char szPacket[8192];
_tcscpy (szPacket, strPacket);
szToken = strtok (szPacket, szMsgHeadTail);//去掉报文的{和}
if (szToken == NULL)
return;
//复制一份传过来的报文,要传递给解包函数用
memcpy(szTempMsg, szToken, strlen(szToken));
szTempMsg[strlen(szToken)] = 0;//给结尾加结尾符号
szMsg = strtok (szToken, szSeparate);//去掉报文的|
if (szMsg == NULL)
return;
for (i=0; i<7; i++)//66为命令种类,随命令种类的数量而更改
{
if (strOperatorCode[i] == szMsg)
{
switch (i)
{
case 0:
Login (pContext, szTempMsg); //调用注册解包函数
break;
case 1:
TimePollSocket (pContext, szTempMsg); // 调用登录解包函数
break;
case 2:
Register (pContext, szTempMsg);
break;
case 3:
ServerInit (pContext, szTempMsg);
break;
case 4:
DealSendErrorClient (pContext, pContext->nCurRoomID);
break;
case 5:
HeartBeat (pContext, szTempMsg);
break;
case 6:
AddMoney (pContext, szTempMsg);
break;
default:
break;
}
break;
}//end of if
}//end of for
*/
}
BOOL CSPGameDlg::InitData()
{
// this->GetDlgItem (IDC_SAVESET)->EnableWindow(FALSE);
this->GetDlgItem (IDC_DISCONNECTGATEWAY)->EnableWindow(FALSE);
this->GetDlgItem (IDC_SENDMESSAGE)->EnableWindow(FALSE);
char szBuf[100];
UINT ret;
ret = GetPrivateProfileString("CONFIGURE","GatewayIP", NULL, szBuf, 100, ".\\Set.ini");
if (ret < 0)
return FALSE;
m_strGatewayIP = szBuf;
ret = GetPrivateProfileString("CONFIGURE","GatewayPort", NULL, szBuf, 100, ".\\Set.ini");
if (ret < 0)
return FALSE;
m_strGatewayPort = szBuf;
ret = GetPrivateProfileString("CONFIGURE","LocalIP", NULL, szBuf, 100, ".\\Set.ini");
if (ret < 0)
return FALSE;
m_strLocalIP = szBuf;
ret = GetPrivateProfileString("CONFIGURE","LocalPort", NULL, szBuf, 100, ".\\Set.ini");
if (ret < 0)
return FALSE;
m_strLocalPort = szBuf;
ret = GetPrivateProfileString("CONFIGURE","UserName", NULL, szBuf, 100, ".\\Set.ini");
if (ret < 0)
return FALSE;
m_strUserName = szBuf;
ret = GetPrivateProfileString("CONFIGURE","UserPassword", NULL, szBuf, 100, ".\\Set.ini");
if (ret < 0)
return FALSE;
m_strPassword = szBuf;
ret = GetPrivateProfileString("CONFIGURE","EnterpriseCode", NULL, szBuf, 100, ".\\Set.ini");
if (ret < 0)
return FALSE;
m_strEnterpriseCode = szBuf;
ret = GetPrivateProfileString("CONFIGURE","NodeID", NULL, szBuf, 100, ".\\Set.ini");
if (ret < 0)
return FALSE;
m_strNodeID = szBuf;
ret = GetPrivateProfileString("CONFIGURE","ConnectID", NULL, szBuf, 100, ".\\Set.ini");
if (ret < 0)
return FALSE;
m_strConnectID = szBuf;
this->InitVariable();
return TRUE;
}
BOOL CSPGameDlg::InitNetwork()
{
this->UpdateData(TRUE);
CString strIP = m_strGatewayIP;
UINT nPort = atoi(m_strGatewayPort);
WSADATA wsaData;
//初始化TCP协议
BOOL ret = WSAStartup(MAKEWORD(2,2), &wsaData);
if(ret != 0)
{
AfxMessageBox("初始化网络协议失败!");
return FALSE;
}
//创建服务器端套接字
m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(m_Socket == INVALID_SOCKET)
{
AfxMessageBox("创建套接字失败!");
closesocket(m_Socket);
WSACleanup();
return FALSE;
}
//绑定到本地一个端口上
sockaddr_in localaddr;
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(nPort); //端口号不要与其他应用程序冲突
localaddr.sin_addr.s_addr = inet_addr(strIP);
if(connect(m_Socket,(LPSOCKADDR)&localaddr,sizeof(localaddr)) == SOCKET_ERROR)
{
AfxMessageBox("连接网关失败!");
closesocket(m_Socket);
WSACleanup();
return FALSE;
}
m_bConnected = TRUE;
//将SeverSock设置为异步非阻塞模式,并为它注册各种网络异步事件,其中m_hWnd
//为应用程序的主对话框或主窗口的句柄
if(WSAAsyncSelect(m_Socket, m_hWnd, NETWORK_EVENT, FD_CLOSE|FD_READ) == SOCKET_ERROR)
{
AfxMessageBox("注册网络异步事件失败!");
WSACleanup();
return FALSE;
}
return TRUE;
}
VOID CSPGameDlg::SendDataGateway(Sgip_Bind pSgip_Bind)
{
int nSendDataLen = sizeof(pSgip_Bind);
int nBytesSent = 0;
while (nBytesSent < nSendDataLen)
{
int nBytes;
if ((nBytes = send(m_Socket, (char*)&pSgip_Bind, nSendDataLen - nBytesSent,0)) == SOCKET_ERROR)
{
if (GetLastError() == WSAEWOULDBLOCK)
{
Sleep(10);
break;
}
else
{
closesocket(m_Socket);
m_Socket = NULL;
m_bConnected = FALSE;
nBytesSent = 0;
return;
}
}
else
{
nBytesSent += nBytes;
}
}
}
VOID CSPGameDlg::InitVariable()
{
InitializeCriticalSection(&cs_SendBuffer);
InitializeCriticalSection(&cs_RecvBuffer);
m_nMsgNumber = 1;
m_bConnected = FALSE;
g_nCommandID = 10000;
UINT nThreadID;
HANDLE hThread = (HANDLE)_beginthreadex(NULL, // Security
0, // Stack size - use default
SendThreadProc, // Thread fn entry point
(void*) this, // Param for thread
0, // Init flag
&nThreadID); // Thread address
if (hThread == NULL )
{
return;
}
hThread = (HANDLE)_beginthreadex(NULL, // Security
0, // Stack size - use default
RecvThreadProc, // Thread fn entry point
(void*) this, // Param for thread
0, // Init flag
&nThreadID); // Thread address
if (hThread == NULL )
{
return;
}
}
VOID CSPGameDlg::FreeVariable()
{
g_bExitThread = FALSE;
DeleteCriticalSection(&cs_RecvBuffer);
DeleteCriticalSection(&cs_SendBuffer);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?