📄 serv.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*)¶m;
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 + -