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

📄 clientsocket.cpp

📁 一个移动通信用SMPP协议写的.非常经典!
💻 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 + -