📄 clientsocket.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "ClientSocket.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
/*///////////////////////////////////////////////////////////////////
函数名: GetClientSocket
功 能: 获取ClientSocket
*/
void TYClientSocket::GetClientSocket(TClientSocket *_ClientSocket)
{
ClientSocket=_ClientSocket;
SequenceNo=0;
}
/*///////////////////////////////////////////////////////////////////
函数名: GetSrvInfo
功 能: 取得服务器的参数信息
*/
bool TYClientSocket::GetSrvInfo(STRUCT_LINKSRVPRA _struct_linksrvpra)
{
struct_linksrvpra=_struct_linksrvpra;
ClientSocket->Close();
ClientSocket->Socket->Close();
ClientSocket->Address=struct_linksrvpra.sIP;
ClientSocket->Port=StrToInt(struct_linksrvpra.sPort);
return true;
}
/*///////////////////////////////////////////////////////////////////
函数名: OpenClientSocket
功 能: 打开ClientSocket
*/
bool TYClientSocket::OpenClientSocket(bool bCloseSocket)
{
if(bCloseSocket)
{
ClientSocket->Close();
ClientSocket->Socket->Close();
}
b_Connected=false;
try
{
ClientSocket->Open();
}
catch (...)
{
ClientSocket->Socket->Close();
return false;
}
return true;
}
//关闭连接
void TYClientSocket::CloseClientSocket()
{
ClientSocket->Socket->Close();
b_Connected=false;
}
/*///////////////////////////////////////////////////////////////////
函数名: ConnectToSrv
输入参数:系统用户名 AnsiString
系统密码 AnsiString
返回: 发送成功返回true,否则返回false
功 能: 与服务器建立连接
*/
bool TYClientSocket::ConnectToSrv()
{
if(!ClientSocket->Active)
return false;
STRUCT_CONNECT StructConnect;
memset(&StructConnect,0,sizeof(StructConnect));
//Package Header
StructConnect.sHeader.dwCommandId=htonl(CTKP_CONNECT);
StructConnect.sHeader.dwSeqNo=htonl(SequenceNo++);
StructConnect.sHeader.dwTotalLen=htonl(sizeof(STRUCT_CONNECT));
StructConnect.sHeader.dwStatus=htonl(0);
//Package Body
strcpy(StructConnect.szAppName,struct_linksrvpra.sUserName.c_str());
strcpy(StructConnect.szPassword,struct_linksrvpra.sUserPwd.c_str());
StructConnect.wAppID=htons(StrToInt(struct_linksrvpra.sUserId));
StructConnect.dwVersion=StrToInt("0");
try{ClientSocket->Socket->SendBuf(&StructConnect,sizeof(STRUCT_CONNECT));}
catch(...){return false;}
return true;
}
/*///////////////////////////////////////////////////////////////////
函数名: ConnectToSrvRep
返回: void
输入参数:服务器返回的连接号 int
功 能: 服务器连接返回DTP_Connect_REP,取得服务器返回的连接号
*/
void TYClientSocket::ConnectToSrvRep()
{
b_Connected=true;
LinkTestNum=0;
}
/*///////////////////////////////////////////////////////////////////
函数名: SendDownRepDataToSrv
返回: void
功 能: 服务器下发数据返回DTP_Down_REP
*/
void TYClientSocket::DeliverRsp(char *Buff,char Confirm_Flag)
{
STRUCT_RECV_CONFIRM SRecvConfirm;
STRUCT_DELIVERY SDeliver; memcpy(&SDeliver,Buff,sizeof(SDeliver)); SRecvConfirm.sHeader.dwTotalLen = htonl(sizeof(STRUCT_RECV_CONFIRM)); SRecvConfirm.sHeader.dwCommandId = htonl(CTKP_RECV_CONFIRM); SRecvConfirm.sHeader.dwStatus = 0; SRecvConfirm.sHeader.dwSeqNo = SDeliver.sDeliveryHeader.sHeader.dwSeqNo; SRecvConfirm.cConfirm_Flag = Confirm_Flag; SRecvConfirm.wAppID = htons(StrToInt(struct_linksrvpra.sUserId)); ClientSocket->Socket->SendBuf(&SRecvConfirm,sizeof(STRUCT_RECV_CONFIRM));}
/*///////////////////////////////////////////////////////////////////
函数名: DisConnectToSrv
返回: 发送成功返回true,否则返回false
功 能: 与服务器断开连接
*/
bool TYClientSocket::DisConnectToSrv()
{
/*
if(!b_Connected)
return false;
STRUCT_DTPDISCONNECT discon;
memset(&discon,0,sizeof(STRUCT_DTPDISCONNECT));
discon.msgHead.Total_Length=htonl(8);
discon.msgHead.Command_ID=htonl(DTP_DisConnect);
try{ClientSocket->Socket->SendBuf(&discon,8);}
catch(...){return false;}
*/
return true;
}
/*///////////////////////////////////////////////////////////////////
函数名: SendDataToSrv
输入参数:要发送到服务器的数据 AnsiString
返回: 发送成功返回true,否则返回false
功 能: 向服务器发数据
*/
bool TYClientSocket::SendDataToSrv(AnsiString MsgContent,AnsiString DstSimNo,AnsiString SrcSimNo)
{
STRUCT_SUBMIT StructSubmit;
memset(&StructSubmit,0,sizeof(StructSubmit));
//Package Header
StructSubmit.sSubmitHeader.sHeader.dwCommandId=htonl(CTKP_SUBMIT);
StructSubmit.sSubmitHeader.sHeader.dwSeqNo=htonl(SequenceNo++);
StructSubmit.sSubmitHeader.sHeader.dwStatus=htonl(0);
//Package Body
StructSubmit.sSubmitHeader.wAppID=htons(StrToInt(struct_linksrvpra.sUserId));
StructSubmit.sSubmitHeader.cReSubmit_Count=0;
//设置TNO
char Simhead[5];
memset(Simhead,0,sizeof(Simhead));
memcpy(Simhead,DstSimNo.c_str(),3);
if (atoi(Simhead)==130 || atoi(Simhead)==131 || atoi(Simhead)==133)
StructSubmit.sSubmitHeader.cTNO=2;
else
StructSubmit.sSubmitHeader.cTNO=1;
StructSubmit.sSubmitHeader.cChannel_Protocol=0;
StructSubmit.sSubmitHeader.cService_ChannelID=(BYTE)StrToInt(struct_linksrvpra.cService_ChannelID); //*****应用指定的服务通道号
strcpy(StructSubmit.sSubmitHeader.szService_Number,"");
StructSubmit.sSubmitHeader.cService_Plat=0;
StructSubmit.sSubmitHeader.cRequest_Plat=0;
StructSubmit.sSubmitHeader.cPriority_Flag=0;
StructSubmit.sSubmitHeader.cTimeOut=6;
StructSubmit.sSubmitHeader.cCredibility_Transmit=0;
StructSubmit.sSubmitHeader.cSaveForTramSmit=0;
StructSubmit.sSubmitHeader.cProtocol_Type=1;
//协议数据包
StructSubmit.sCMPP12Submit.sHeader.dwCommand_ID=htonl(CMPP12_SUBMIT);
StructSubmit.sCMPP12Submit.sHeader.dwSequence_ID=htonl(SequenceNo++);
StructSubmit.sCMPP12Submit.cMsg_Level=0;
//yuan strcpy(StructSubmit.sCMPP12Submit.szService_ID,"201"); //*****业务类型
strcpy(StructSubmit.sCMPP12Submit.szService_ID,struct_linksrvpra.szService_ID.c_str()); //*****业务类型
StructSubmit.sCMPP12Submit.cFee_UserType=3;
strcpy(StructSubmit.sCMPP12Submit.szFee_terminal_ID,DstSimNo.c_str()); //*****被计费用户号码
StructSubmit.sCMPP12Submit.cTP_pid=0;
StructSubmit.sCMPP12Submit.cTP_udhi=0;
StructSubmit.sCMPP12Submit.cMsg_Fmt=15;
//yuan strcpy(StructSubmit.sCMPP12Submit.szFeeType,"01");
//yuan strcpy(StructSubmit.sCMPP12Submit.szFeeCode,"000000");
strcpy(StructSubmit.sCMPP12Submit.szFeeType,struct_linksrvpra.szFeeType.c_str());
strcpy(StructSubmit.sCMPP12Submit.szFeeCode,struct_linksrvpra.szFeeCode.c_str());
StructSubmit.sCMPP12Submit.cDestUsr_tl=1;
strcpy(StructSubmit.sCMPP12Submit.szSrc_terminal_id,SrcSimNo.c_str()); //*****源终端MSISDN号码
strcpy(StructSubmit.sCMPP12Submit.szDest_terminal_ids,DstSimNo.c_str());//*****接受业务的MSISDN号码
char strTmp[160];
memset(strTmp,0,sizeof(strTmp));
strcpy(strTmp,MsgContent.c_str());
for(int i=0;i<sizeof(strTmp);i++)
{
if(strTmp[i]=='/')
{
strTmp[i]='\n';
}
else if(strTmp[i]=='\0')
break;
}
StructSubmit.sCMPP12Submit.wMsg_Length=htons(MsgContent.Length()); //*****被发送信息长度
strcpy(StructSubmit.sCMPP12Submit.szMsg_Content,strTmp); //*****被发送信息内容
DWORD dwSubmitLen;
dwSubmitLen = sizeof(STRUCT_SUBMIT)-sizeof(StructSubmit.sCMPP12Submit.szMsg_Content)+ntohs(StructSubmit.sCMPP12Submit.wMsg_Length);
StructSubmit.sSubmitHeader.sHeader.dwTotalLen=htonl(dwSubmitLen); //消息包的总长
StructSubmit.sCMPP12Submit.sHeader.dwTotal_Length = htonl(dwSubmitLen-sizeof(STRUCT_SUBMIT_HEADER));
StructSubmit.sSubmitHeader.wProtocol_Length = htons((WORD)ntohl(StructSubmit.sCMPP12Submit.sHeader.dwTotal_Length));
try
{
ClientSocket->Socket->SendBuf((char *)&StructSubmit,dwSubmitLen) ;
}
catch(...)
{
return false;
}
return true;
}
//发送测试消息
int TYClientSocket::SendLinkTest(bool bCloseSocket)
{
//第一次连接
if(!b_Connected)
{
OpenClientSocket(bCloseSocket);
return 1;
}
//自动重连
if(LinkTestNum>2)
{
OpenClientSocket(bCloseSocket);
return 2;
}
//测试
STRUCT_LINKTEST StructLinkTest;
STRUCT_CTKP_MSG_HEADER StructCtkpMsgHeader;
memset(&StructLinkTest,0,sizeof(StructLinkTest));
StructCtkpMsgHeader.dwTotalLen=htonl(sizeof(StructLinkTest));
StructCtkpMsgHeader.dwCommandId=htonl(CTKP_LINKTEST);
StructCtkpMsgHeader.dwSeqNo=htonl(SequenceNo);
StructCtkpMsgHeader.dwStatus=htonl(0);
StructLinkTest.sHeader=StructCtkpMsgHeader;
ClientSocket->Socket->SendBuf(&StructLinkTest,sizeof(STRUCT_LINKTEST));
LinkTestNum++;
return 0;
}
//接收测试消息
void TYClientSocket::RcvLinkTest()
{
LinkTestNum--;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -