大放送

tomew 2003-09-22 10:46:00
UINT ReceiveThread( LPVOID pParam )
{
CCMPPDlg* pDlg=(CCMPPDlg*)pParam;
UINT index;//线程序号
index=0;

CString sOut,sTitle;
//本来为多个接收连接所做,因为移动只开放了一个接收连接,所以没有实际的应用,只用于界面
sTitle.Format("接收连接 %d: ",index+1);

dpl_status_t stat;
conn_desc conn;
cmppe_login cl;
cmppe_packet cp;

int status;
int type;
int result;
int seq;

UINT count1=0,count2=0,count3=0;

//连接远程服务器
REC_LINK:

pDlg->AddListStatus(sTitle+"请求连接移动短信网关!");

memset(&conn,0,sizeof(conn));

stat = cmpp_connect_to_ismg(host,port,&conn);

if(stat != DPL_SUCCESS)
{
CString sout;

sout.Format("<ICP-TEST> connect error[stat=%d]\n",stat);

pDlg->AddListStatus(sout);

if(count1++<5)
{
CString sOut;

sOut.Format("%s:重新连接移动短信网关!",sTitle);

pDlg->AddListStatus(sOut);

goto REC_LINK;
}

return 0;
}

//登录
count1=0;

pDlg->AddListStatus(sTitle+"连接移动短信网关成功,正在进行登录!");

memset(&cl,0,sizeof(cmppe_login));

Login_value_set(&cl);

//设置为接收型连接
cl.icp_bind_type=1;

stat = cmpp_login(&conn,&cl);

if(stat != DPL_SUCCESS)
{
CString sout;

sout.Format("%s<ICP-TEST> send login request error[stat=%d]\n",sTitle,stat);

pDlg->AddListStatus(sout);

goto finished;
}


//短信息内容或者状态报告在cp中
memset(&cp,0,sizeof(cmppe_packet));

#ifdef UPGRADE
stat = cmpp_recv(&conn,&cp,0,(unsigned int*)&seq);
#else
stat = cmpp_recv(&conn,&cp,0);
#endif

if(stat != DPL_SUCCESS)
{
pDlg->AddListStatus(sTitle+"接收数据时发生错误!");
goto finished;
}

type = cp.pk_head.pk_cmd;//决定是什么类型的包

status = cp.pk_head.pk_stat;//包的状态,为0是正常,不为0是出错

result = cp.result;

seq = cp.pk_head.pk_seq;

sOut.Format("%s<ICP-TEST1>[type=%08x][status=%08x][seq=%08x][result=%02x]\n",\
sTitle,type,status,seq,result);

pDlg->AddListStatus(sOut);

//if(type != 0x80000001)
if(type != CMPPE_LOGIN_RESP)
{
CString sout;
sout.Format("%sLOGIN Recv a Unknown packet![COMMAND_ID=%08x]\n", sTitle,type);
pDlg->AddListStatus(sout);
goto finished;
}

if(status!=0)
{
pDlg->AddListStatus(sTitle+"登录移动短信网关失败!");
goto finished;
}

while (LOOP)//WaitForSingleObject(m_hEventKill, 0) == WAIT_TIMEOUT)
{
pDlg->AddListStatus((CString)"等待用户上传短信......\n");

memset(&cp,0,sizeof(cmppe_packet));
stat = cmpp_recv(&conn,&cp,0,(unsigned int*)&seq);

type = cp.pk_head.pk_cmd;
status = cp.pk_head.pk_stat;

result = cp.result;
seq = cp.pk_head.pk_seq;
//if(type != 0x00000005)
if(type != CMPPE_DELIVER)
{
CString sout;
sout.Format("Status Report Recv a Unkown packet![type=%08x][status=%08x][seq=%08x][result=%02x]\n", type,status,seq,result);
pDlg->AddListStatus(sout);
cmpp_logout(&conn);
pDlg->AddListStatus(sTitle+"注销本次登录!");
cmpp_disconnect_from_ismg(&conn);
pDlg->AddListStatus(sTitle+"断开和移动短信网关的连接!");
Sleep(100);
goto REC_LINK;//重新连接
}
CString sout;
sout.Format("<ICP-TEST3>[type=%08x][status=%08x][seq=%08x][result=%02x]\n",type,status,seq,result);
pDlg->AddListStatus(sout);


//cp.pk_data.pk_deliver.status_rpt==1是状态报告
//cp.pk_data.pk_deliver.status_rpt==0是短消息数据
if(cp.pk_data.pk_deliver.status_rpt)//判断是否为状态报告
{
//m_bStatus=true;
CTimeSpan span=CTime::GetCurrentTime()-g_tm;
sout.Format("状态报告延时为 = %d 秒",span.GetSeconds());
pDlg->AddListStatus(sout);
sout.Format("接收到状态报告:(%s),(%s),(%s)",cp.pk_data.pk_deliver.src_addr,cp.pk_data.pk_deliver.dst_addr,cp.pk_data.pk_deliver.pk_sm.short_msg);
pDlg->AddListStatus(sout);

//add by wangyi 2003.9.12
//CString strTel=cp.pk_data.pk_deliver.src_addr;
CString strTel=cp.pk_data.pk_deliver.dst_addr;
strTel.TrimLeft();
strTel.TrimRight();

if (pDlg->m_strTestCarSim == strTel)
{
pDlg->KillTimer(TIMER_TESTSEND);
}

//if (m_strTestTel1 == strTel)
// pDlg->KillTimer(TIMER_TESTSEND);
}
else
{
if( cp.pk_data.pk_deliver.data_coding == 8)//ucs2中文
{
Convert(cp.pk_data.pk_deliver.pk_sm.short_msg,cp.pk_data.pk_deliver.sm_len);//编码转换

sout.Format("cp.pk_data.pk_deliver.data_coding = %d",cp.pk_data.pk_deliver.data_coding );
pDlg->AddListStatus(sout);

sout.Format("接收到短信:(%s),(%s),(%s)",cp.pk_data.pk_deliver.src_addr,cp.pk_data.pk_deliver.dst_addr,cp.pk_data.pk_deliver.pk_sm.short_msg);
pDlg->AddListStatus(sout);

SMS_INFO* pInfo=new SMS_INFO;
//结合第一个listctrl的列名看
pInfo->bStatus=1;//状态-接收
pInfo->sService=(CString)cp.pk_data.pk_deliver.svc_type;//服务名:GPS...
pInfo->Num_Send=(CString)cp.pk_data.pk_deliver.src_addr;//发送短信的手机号
pInfo->Num_Receive=(CString)cp.pk_data.pk_deliver.dst_addr;//接收短信的手机号
pInfo->RecvTime=CTime::GetCurrentTime();//短信接收时间
pInfo->SMS_Content=(CString)cp.pk_data.pk_deliver.pk_sm.short_msg;//短信的内容
pDlg->DealWithSMSInfo(pInfo);
delete pInfo;
}
else
{
if( cp.pk_data.pk_deliver.data_coding == 0 )//ascii
{
sout.Format("cp.pk_data.pk_deliver.data_coding = %d",cp.pk_data.pk_deliver.data_coding );
pDlg->AddListStatus(sout);

sout.Format("接收到短信:(%s),(%s),(%s)",cp.pk_data.pk_deliver.src_addr,cp.pk_data.pk_deliver.dst_addr,cp.pk_data.pk_deliver.pk_sm.short_msg);
pDlg->AddListStatus(sout);

SMS_INFO* pInfo=new SMS_INFO;
pInfo->bStatus=1;//状态-接收
pInfo->sService=(CString)cp.pk_data.pk_deliver.svc_type;
pInfo->Num_Send=(CString)cp.pk_data.pk_deliver.src_addr;
pInfo->Num_Receive=(CString)cp.pk_data.pk_deliver.dst_addr;
pInfo->RecvTime=CTime::GetCurrentTime();
pInfo->SMS_Content=(CString)cp.pk_data.pk_deliver.pk_sm.short_msg;
pDlg->DealWithSMSInfo(pInfo);
delete pInfo;
}
else
{
sout.Format("收到采用不能识别的格式打包的数据:cp.pk_data.pk_deliver.data_coding = %d",cp.pk_data.pk_deliver.data_coding);
pDlg->AddListStatus(sout);
}
}
}

cmpp_deliver_resp(&conn,cp.pk_head.pk_seq, cp.result);

Sleep(100);
}

cmpp_logout(&conn);

pDlg->AddListStatus(sTitle+"注销本次登录!");

finished:

cmpp_disconnect_from_ismg(&conn);

pDlg->AddListStatus(sTitle+"断开和移动短信网关的连接!");

return 0;
}
...全文
44 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧