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

📄 serv.cpp

📁 中国电信CMPP2.0原代码+程序
💻 CPP
字号:
/**
*	文件:	serv.cpp
*	作者:	PrinceToad,princetoad@tom.com,http://gmm.nease.net
*	说明:	中国移动CMPP2.0短消息网关开发接口库 示例工程模拟网关文件
*	版本:	1.3
*/
#include	"serv.h"

SOCKET		serverSocket;
int			g_srvport = 7890;
CLogFile	*log = NULL;
bool		g_fstop = true;
CLIENT_CONN	conn_list[255];
int			nConnectTotal = 0;
cmpp_conn	conn;

int		MB(const char* fmt, UINT nType, ...)
{
	char buffer[MAX_LINE];

	va_list arglist;						
	va_start( arglist, fmt );								/* Initialize variable arguments. */
	_vsnprintf( buffer, sizeof(buffer), fmt, arglist );		/*The wvsprintf function formats and stores a series of characters and values in a buffer*/
	va_end(arglist);										/* Reset variable arguments.      */

	return AfxMessageBox(buffer, nType);
}


int		MB(const char* fmt, ...)
{
	char buffer[MAX_LINE];

	va_list arglist;						
	va_start( arglist, fmt );								/* Initialize variable arguments. */
	_vsnprintf( buffer, sizeof(buffer), fmt, arglist );		/*The wvsprintf function formats and stores a series of characters and values in a buffer*/
	va_end(arglist);										/* Reset variable arguments.      */

	return AfxMessageBox(buffer);
}

bool serv_listen()
{
	SOCKADDR_IN		serverSockAddr;
	int				status = 0;

	try
	{
		memset(&serverSockAddr, 0, sizeof(serverSockAddr));
		serverSockAddr.sin_port = htons(g_srvport);
		serverSockAddr.sin_family = AF_INET;
		serverSockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
		
		serverSocket = socket(AF_INET, SOCK_STREAM, 0);
		if (serverSocket == INVALID_SOCKET)
		{
			log->Write("create gw socketServer fail!\n");
			goto finished;
		}

		status = bind(serverSocket, \
			(LPSOCKADDR)&serverSockAddr, \
			sizeof(serverSockAddr));
		if (status == SOCKET_ERROR)
		{
			log->Write("bind gw socketServer fail!\n");
			goto finished;
		}

		status = listen(serverSocket, SOMAXCONN);
		if (status == SOCKET_ERROR)
		{
			log->Write("listen gw socketServer fail!\n");
			goto finished;
		}
		log->Write("模拟网关开始监听连接...\n");
	}
	catch(...)
	{
		log->Write("listenServer exception!\n");
		goto finished;
	}
	return true;
finished:
	closesocket(serverSocket);
	return false;
}

bool serv_clean()
{
	if (SOCKET_ERROR == closesocket(serverSocket))
	{
		log->Write("Failed to close serv socket!\n");
		return false;
	}

	return true;
}

bool serv_accept()
{
	DWORD			threadID;

	CreateThread(0,
		0,
		(LPTHREAD_START_ROUTINE)serv_accept_proc,
		NULL,
		0,
		&threadID);	
	return true;
}

UINT	serv_accept_proc(void *param)
{
	int				nRetCode = 0;
	int				stat = 0;
	SOCKADDR_IN		clientSockAddr;
	SOCKET			clientSocket;
	int				addrLen = sizeof(SOCKADDR_IN);
//	DWORD			threadID;
	char			sIcpId[7];
	DWORD			threadID;

	ZeroMemory(sIcpId, 7);
	try
	{
		while(!g_fstop)
		{
			clientSocket = accept(serverSocket, \
				(LPSOCKADDR)&clientSockAddr, \
				&addrLen);
			if (clientSocket == INVALID_SOCKET)
			{
				log->Write("模拟网关接收连接失败!\n");
				continue;
			}
			else
			{
				log->Write("收到一个连接,开始接收登录请求...\n");
				if (CMPP_SUCCESS ==	cmpp_waitfor_login(clientSocket, sIcpId))
				{
					log->Write("\t登录成功,客户端ICPID = %s!\n", sIcpId);
					AddToList(clientSocket, sIcpId);
					CreateThread(0,
						0,
						(LPTHREAD_START_ROUTINE)talkToclient,
						(void*)clientSocket,
						0,
						&threadID);	
				}
				else
				{
					log->Write("\t登录失败!\n");
				}
			}
		}
	}
	catch(...)
	{
		log->Write("serv_accept_proc fail!\n");
		goto finished;
	}
finished:
		return nRetCode;
}

UINT talkToclient(void *param)
{
	int				nRetCode = 0;
	cmpp_status_t	status = CMPP_SUCCESS;
	cmppg_icp_packet cip;

	SOCKET			*clientSocket = (SOCKET*)&param;
	while(!g_fstop && (CMPP_SUCCESS == status))
	{
		status = cmpp_recv_icp(*clientSocket, &cip, CMPP_RECV_TIMEOUT);
		if (status == CMPP_SOCKET_RECVTIMEOUT)
		{
			status = CMPP_SUCCESS;
			continue;
		}
		if (status != CMPP_SUCCESS)
			log->Write("接收SP请求包失败!\n");
		else
		{
			log->Write("收到一条请求!\n");
			log_pkg_content(cip);
		}
	}
	RemoveFromList(*clientSocket);
//	closesocket(*clientSocket);
	return nRetCode;
}

void log_pkg_content(cmppg_icp_packet cip)
{
//	int		nLen;
	int		nCmd;
//	int		nSeq;

	try
	{
		nCmd = cip.pk_head.nCommandId;
		if (nCmd == CMPP_SUBMIT)
		{
			log->Write("收到submit消息--<%s>\t目的号码--<%s>\t消息长度--<%d>\t消息内容--<%s>\n", \
				cip.pk_data.pk_submit.sMsgSrc, \
				cip.pk_data.pk_submit.sDestTerminalId, \
				int(cip.pk_data.pk_submit.cMsgLen), \
				cip.pk_data.pk_submit.sMsgContent);
		}
		if (nCmd == CMPP_ACTIVE_TEST)
			log->Write("收到活动测试包!\n");
	}
	catch(...)
	{
		log->Write("<log_pkg_content>exception!\n");
	}
	return;
}

void	AddToList(SOCKET hClient, CString sIcpid)
{
	CLIENT_CONN		cNode;

	cNode.hClient = hClient;
	cNode.sIcpid = sIcpid;
	
	conn_list[nConnectTotal] = cNode;
	nConnectTotal++;

	return;
}

void	RemoveFromList(SOCKET hClient)
{
	int i = 0, j = 0;
	closesocket(hClient);

	for(i=0; i<nConnectTotal; i++)
	{
		if (conn_list[i].hClient == hClient)
		{
			break;
		}
	}

	for (j=i; j<nConnectTotal; j++)
	{
		conn_list[j] = conn_list[j + 1];
	}
	nConnectTotal--;
}

SOCKET	GetFromList(CString sIcpid)
{
	for (int i=0; i<nConnectTotal; i++)
	{
		if (conn_list[i].sIcpid == sIcpid)
			return conn_list[i].hClient;
	}

	return NULL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -