⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 socketlisten.cpp

📁 java程序五子棋源代码。 java程序五子棋源代码。
💻 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 + -