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 + -
显示快捷键?