📄 socketlisten.cpp
字号:
// SocketListen.cpp : implementation file
//
#include "stdafx.h"
#include "ChessGate.h"
#include "SocketListen.h"
#include "ChessGateDlg.h"
//#include "..\..\inc\transmit.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern size_t CodeConvert(char* out_buf,size_t buf_len,char * in_str,char * fromcode,char * tocode,bool conv_begin = false);
/////////////////////////////////////////////////////////////////////////////
// CSocketListen
char* split(char* &text,const char *seps)
{
if(text == NULL){
return NULL;
}
char* ret = text;
char* tmp = strstr(text,seps);
if (tmp != NULL)
{
text = tmp + strlen(seps);
*tmp = '\0';
}
else
text = NULL;
return ret;
}
CSocketListen::CSocketListen(CChessGateDlg *pChessGateDlg,int queuenum)
{
InitializeCriticalSection(cts_SocketQueue);
pDlg = pChessGateDlg;
this->queuenum=queuenum;
}
CSocketListen::~CSocketListen()
{
}
// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CSocketListen, CSocket)
//{{AFX_MSG_MAP(CSocketListen)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0
/////////////////////////////////////////////////////////////////////////////
// CSocketListen member functions
void CSocketListen::OnReceive(int nErrorCode)
{
NODE_STRUCT RecvNode;
char szBuf[1024]={0};
char szInBuf[1024]={0};
CString strTemp;
// int err_flag;
CString m_recip;
memset(szBuf,0,sizeof szBuf);
memset(szInBuf,0,sizeof szInBuf);
memset(&RecvNode,0,sizeof RecvNode);
RecvNode.queuenum = this->queuenum;
ReceiveFrom(szInBuf,sizeof(szInBuf),m_recip,RecvNode.clientport);
// ReceiveFrom(szBuf,sizeof(szBuf),m_recip,RecvNode.clientport);
strcpy(RecvNode.clientip,m_recip);
//UTF8toGB2312(szBuf,sizeof(szBuf),szInBuf);
CodeConvert(szBuf,sizeof(szBuf),szInBuf,"UTF-8","GB2312",true);
if(strcmp(szBuf,"")==0)
{
return;
}
char* input =szBuf;
char* output = NULL;
// pDlg->WriteLog(szBuf);
output = split(input,DIVISION);
strcpy(RecvNode.err_code,output);
output = split(input,DIVISION);
strcpy(RecvNode.service_id,output);
if(strcmp(RecvNode.service_id , "999")==0) //检测包响应
{
CheckRespond(RecvNode.clientport,RecvNode.clientip);
}
else{ //组织共享内存的节点结构
ReceiveDataRespond(RecvNode.clientport,RecvNode.clientip);
output = split(input,DIVISION);
strcpy(RecvNode.operate_id,output);
output = split(input,DIVISION);
strcpy(RecvNode.body,output);
DispenseData(RecvNode); //分发数据包给具体的业务处理
}
}
void CSocketListen::CheckRespond(int clientport,LPCTSTR clientip) //检测包响应
{
// CSingleLock lock(&pDlg->cts_SocketQueue[queuenum]);
// lock.Lock();
// if(pDlg->pSocketlisten[queuenum]->SendTo(CHECKDATABAG,strlen(CHECKDATABAG),clientport,clientip) != SOCKET_ERROR){
if(SendData(RESPONDDATABAG,strlen(RESPONDDATABAG),clientport,clientip)){
pDlg->AddMsg("给客户端:%s 发送检测包成功",clientip);
}
else{
pDlg->AddMsg("给客户端:%s 发送检测包失败!",clientip);
}
// lock.Unlock();
}
void CSocketListen::ReceiveDataRespond(int clientport,LPCTSTR clientip) //接收业务数据成功响应
{
// CSingleLock lock(&pDlg->cts_SocketQueue[queuenum]);
// lock.Lock();
// if(pDlg->pSocketlisten[queuenum]->SendTo(RESPONDDATABAG,strlen(RESPONDDATABAG),clientport,clientip) != SOCKET_ERROR){
if(SendData(RESPONDDATABAG,strlen(RESPONDDATABAG),clientport,clientip)){
pDlg->AddMsg("给客户端:%s:%d 发送业务数据成功接收响应",clientip,clientport);
}
else{
pDlg->AddMsg("给客户端:%s:%d 发送业务数据失败接收响应",clientip,clientport);
}
// lock.Unlock();
}
void CSocketListen::DispenseData(NODE_STRUCT RecvNode){
if(strcmp(RecvNode.service_id , "000")==0){ //注册登录
if(pDlg->login_recv_queue->Insert(&RecvNode) == FALSE){
pDlg->AddMsg("写登录模块接收共享内存错误!");
return;
}
// pDlg->WriteLog(RecvNode.body);
}
else if(strcmp(RecvNode.service_id , "001")==0){ //五子棋服务模块
if(pDlg->gobang_recv_queue->Insert(&RecvNode) == FALSE){
pDlg->AddMsg("写五子棋服务模块接收共享内存错误!");
return;
}
}
pDlg->WriteLog(RecvNode.body);
}
bool CSocketListen::SendData(const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress, int nFlags){
bool ret=false;
CSingleLock lock(&cts_SocketQueue);
lock.Lock();
if(SendTo(lpBuf,nBufLen,nHostPort,lpszHostAddress,nFlags)!= SOCKET_ERROR){
ret = true;
}
lock.Unlock();
return ret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -