在网上找了好长时间,也没有发现有SGIP的例子,伤感之余,终于做了一个Delphi6.0的SGIP例子
包含了一个服务端和一个客户端,协议共用,服务端为非阻塞长连接,客户端为阻塞短连接,
程序写的很乱,风格也很差,希望高手多多指教 
[email protected],[email protected])//客户端
unit TestMain;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls, ExtCtrls, xy, winsock;
const
  FV_SNumber=3053112345;
  FV_LoginPass='hi';
  FV_LoginName='hi';
  FV_SPNumber='12345';
  T_Tel='13000000000';
  FV_corpID='12345';
  T_msg='我在天空写下你的名字,没有被风带走';
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    ClientSocket1: TClientSocket;
    Button3: TButton;
    Button4: TButton;
    Button2: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    ServerSocket1: TServerSocket;
    panel1: TPanel;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button7Click(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
    //客户端协议定义
    sHead:              SGIPHead;       //消息头定义
    sBind:              XBind;          //连接请求验证
    sBind_Resp:         Bind_Resp;      //响应连接请求验证
    sSubmit:            XSubmit;        //SP->SMG提交短信
    sSubmit_Resp:       Submit_Resp;    //SMG响应SP提交的短信状态
    sDeliver:           XDeliver;       //SMG->SP提交短信
    sDeliver_Resp:     Deliver_Resp;  //SP响应SMG提交的短信状态
    sReport:            XReport;        //SMG->SP先前的短信状态
    sReport_Resp:       Report_Resp;    //响应命令执行状况
    //服务端协议定义
    cHead:              SGIPHead;       //消息头定义
    cBind:              XBind;          //连接请求验证
    cBind_Resp:         Bind_Resp;      //响应连接请求验证
    cSubmit:            XSubmit;        //SP->SMG提交短信
    cSubmit_Resp:       Submit_Resp;    //SMG响应SP提交的短信状态
    cDeliver:           XDeliver;       //SMG->SP提交短信
    cDeliver_Resp:     Deliver_Resp;  //SP响应SMG提交的短信状态
    cReport:            XReport;        //SMG->SP先前的短信状态
    cReport_Resp:       Report_Resp;    //响应命令执行状况
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);
begin
  ClientSocket1.Active:=false;
  if ClientSocket1.Active then
    memo1.Lines.Add('客户端关闭失败')
  else
    memo1.Lines.Add('客户端关闭成功');
end;procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientSocket1.Active:=true;
  if ClientSocket1.Active then
    memo1.Lines.Add('客户端打开成功')
  else
    memo1.Lines.Add('客户端打开失败');
end;procedure TForm1.Button6Click(Sender: TObject);
begin
  ServerSocket1.Active:=true;
  if ServerSocket1.Active then
    memo1.Lines.Add('服务端打开成功')
  else
    memo1.Lines.Add('服务端打开失败');
end;procedure TForm1.Button5Click(Sender: TObject);
begin
  ServerSocket1.Active:=false;
  if ServerSocket1.Active then
    memo1.Lines.Add('服务端关闭失败')
  else
    memo1.Lines.Add('服务端关闭成功');
end;

解决方案 »

  1.   


    procedure TForm1.Button3Click(Sender: TObject);
    var
      FV_Date1_S,FV_Date2_S:string;
      str_i,SendSize:integer;
      stream1:TWinSocketStream;
      abc,bc:longword;
    begin
        stream1:=TWinSocketStream.Create(ClientSocket1.Socket,30000);
        memo1.Lines.Add('-------------------向服务端发送BIND请求--------------------');
        if not ClientSocket1.Active then
        begin
          memo1.Lines.Add('客户端没有打开');
          exit;
        end;
        DateTimeToString(FV_Date1_S,'mmddhhnnss',now);
        DateTimeToString(FV_Date2_S,'zzz',now);
        FillChar(sBind,sizeof(sBind),0);
        FillChar(sHead,sizeof(sHead),0);
        str_i:=sizeof(sHead)+sizeof(sBind);
        sBind.LonginType:=1;
        strpcopy(sBind.LonginPass,FV_LoginPass);
        strpcopy(sBind.LonginName,FV_LoginName);
        abc:=htonl(FV_SNumber);
        sHead.MessageLength:=htonl(str_i);
        sHead.CommandId:=htonl(SGIP_Bind);
        sHead.SNumber1:=abc;
        sHead.SNumber2:=htonl(StrToInt(FV_Date1_S));
        sHead.SNumber3:=htonl(StrToInt(FV_Date2_S));
        stream1.WriteBuffer(sHead,sizeof(sHead));
        stream1.WriteBuffer(sBind,sizeof(sBind));
        memo1.Lines.Add('sHead.MessageLength      '+inttostr(ntohl(sHead.MessageLength)));
        memo1.Lines.Add('sHead.CommandId          '+inttostr(ntohl(sHead.CommandId)));
        bc:=ntohl(abc);
        memo1.Lines.Add('sHead.SNumber1           '+inttostr(bc));
        memo1.Lines.Add('sHead.SNumber2           '+inttostr(ntohl(sHead.SNumber2)));
        memo1.Lines.Add('sHead.SNumber3           '+inttostr(ntohl(sHead.SNumber3)));
        memo1.Lines.Add('sBind.LonginType         '+inttostr(sBind.LonginType));
        memo1.Lines.Add('sBind.LonginName         '+sBind.LonginName);
        memo1.Lines.Add('sBind.LonginPass         '+sBind.LonginPass);
        memo1.Lines.Add('------------------Bind请求已发送----------------------');
        if stream1.WaitForData(5000) then
        begin
          fillchar(cHead,sizeof(cHead),0);
          fillchar(cbind_resp,sizeof(cBind_Resp),0);
          stream1.ReadBuffer(cHead,sizeof(cHead));
          stream1.ReadBuffer(cBind_resp,sizeof(cBind_resp));
        end;
        memo1.Lines.Add('cHead.MessageLength      '+inttostr(ntohl(cHead.MessageLength)));
        bc:=ntohl(cHead.CommandId);
        memo1.Lines.Add('cHead.CommandId          '+inttostr(bc));
        bc:=ntohl(cHead.SNumber1);
        memo1.Lines.Add('cHead.SNumber1           '+inttostr(bc));
        memo1.Lines.Add('cHead.SNumber2           '+inttostr(ntohl(cHead.SNumber2)));
        memo1.Lines.Add('cHead.SNumber3           '+inttostr(ntohl(cHead.SNumber3)));
        memo1.Lines.Add('cBind.LonginType         '+inttostr(cBind_resp.Result));
        stream1.Free;
    end;procedure TForm1.Button4Click(Sender: TObject);
    //type
      {abc=packed record
        head:SGIPHead;
        submit:xSubmit;
      end;}
    var
      FV_Date1_S,FV_Date2_S:string;
      i,SendSize:integer;
      //xxx:abc;
      stream2:twinsocketstream;
      abc,bc:longword;
      line1,line2:longword;
    begin
      stream2:=twinsocketstream.Create(clientsocket1.Socket,5000);
      SendSize:=0;
      memo1.Lines.Add('-------------------------submit--------------------------');
      if not ClientSocket1.Active then
      begin
        memo1.Lines.Add('-------------------客户端没有打开,submit失败-------------');
        exit;
      end;
      DateTimeToString(FV_Date1_S,'mmddhhnnss',now);
      DateTimeToString(FV_Date2_S,'zzz',now);
      FillChar(sSubmit,sizeof(sSubmit),0);
      FillChar(sHead,sizeof(sHead),0);
      with ssubmit do
      begin
        strpcopy(SPNumber,'4488');//;
        ChargeNumber        :='8613188890924';
        UserCount           :=1;               //1-100
        {for i:=1 to UserCount do
        begin
          //strpcopy(UserNumber[i-1].TelN,'8613065073355');//+T_Tel);//          :array of TelCount;  //长度为UserCount
          UserNumber[i-1].TelN:='8613011725853';
        end;}
        UserNumber:='8613188890924';
        CorpID:='41027';//CorpID:='4488';//strpcopy(CorpID,FV_corpID);
        ServiceType:='4488';//FV_SPNumber);//'4488';
        FeeType             :=1;
        FeeValue            :='0';
        GivenValue          :='0';
        AgentFlag           :=0;
        MOrelatetoMTFlag    :=2;
        Priority            :=0;
        ExpireTime          :='';
        ScheduleTime        :='';
        ReportFlag          :=1;
        TP_pid              :=0;
        tp_udhi             :=0;
        MessageCoding       :=15;
        MessageType         :=0;
        MessageLength       :=htonl(161);
        strpcopy(MessageContent,T_msg);  //长度为  MessageLength;
        //Reserve             :='';
      end;
      {line1:=sizeof(sHead);
      line2:=sizeof(sSubmit);}
      with sHead do
      begin
        abc:=htonl(FV_SNumber);
        MessageLength:=htonl(sizeof(sHead)+sizeof(sSubmit)-3);
        CommandId:=htonl(SGIP_Submit);
        SNumber1:=abc;
        SNumber2:=htonl(StrToInt(FV_Date1_S));
        SNumber3:=htonl(StrToInt(FV_Date2_S));
      end;
      

  2.   

    line1:=stream2.Write(shead,sizeof(shead));
      line2:=stream2.Write(sSubmit,sizeof(sSubmit)-3);
      if stream2.WaitForData(5000) then
      begin
        fillchar(cHead,sizeof(cHead),0);
        fillchar(cSubmit_Resp,sizeof(cSubmit_Resp),0);
        memo1.Lines.Add('read submit Head ..............');
        try
          stream2.ReadBuffer(cHead,sizeof(cHead));
          stream2.ReadBuffer(cSubmit_Resp,sizeof(cSubmit_Resp));
        except
          on e:exception do
          memo1.Lines.Add(e.Message);
        end;
        memo1.Lines.Add('read submit csubmit_resp ..............');
        //stream2.ReadBuffer(cBind_Resp,sizeof(cBind_resp));
      end;
      stream2.Free;
    end;procedure TForm1.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      commandI,PackSize:Longword;
      Recv1I,Recv2I:integer;
    begin
      FillChar(sHead,sizeof(sHead),0);
      FillChar(sBind,sizeof(sBind),0);
      Recv1I:=socket.ReceiveBuf(sHead,sizeof(sHead));
      commandI:=ntohl(sHead.CommandId);
      PackSize:=ntohl(sHead.MessageLength);
      if commandI=SGIP_UNBIND_RESP then
      begin
        memo1.Lines.Add('------------------接收到SGIP_UNBIND_RESP请求------------------');
        exit;
      end;
      Recv2I:=socket.ReceiveBuf(sBind,sizeof(sBind));
      if commandI=SGIP_BIND_RESP then
        memo1.Lines.Add('---------------------SGIP_BIND_RESP------------------')
      else
      if commandI=SGIP_SUBMIT_RESP then
        memo1.Lines.Add('---------------------SGIP_SUBMIT_RESP----------------')
      else
        memo1.Lines.Add('---------------------'+inttostr(commandI)+'------------------');
      memo1.Lines.Add('MessageLength        '+inttostr(ntohl(sHead.MessageLength)));
      memo1.Lines.Add('CommandId            '+inttostr(commandI));
      memo1.Lines.Add('SNumber              '+inttostr(ntohl(sHead.SNumber1))+' '+
            inttostr(ntohl(sHead.SNumber2))+' '+inttostr(ntohl(sHead.SNumber3)));
      memo1.Lines.Add('Result               '+inttostr(sBind_Resp.Result));
      memo1.Lines.add('------------------end SGIP_UNBIND_RESP-------------------');
    end;procedure TForm1.Button7Click(Sender: TObject);
    var
      FV_Date1_S,FV_Date2_S:string;
      stream3:TWinSocketStream;
    begin
      Stream3:=TWinSocketStream.Create(clientSocket1.Socket,5000);
      memo1.Lines.Add('-------------------向服务端发送UnBIND请求--------------------');
      if not ClientSocket1.Active then
      begin
        memo1.Lines.Add('客户端没有打开');
        stream3.free;
        exit;
      end;
      DateTimeToString(FV_Date1_S,'mmddhhnnss',now);
      DateTimeToString(FV_Date2_S,'zzz',now);
      FillChar(sHead,sizeof(sHead),0);
      sHead.MessageLength:=htonl(sizeof(sHead));
      sHead.CommandId:=htonl(SGIP_UNBIND);
      sHead.SNumber1:=htonl(FV_SNumber);
      sHead.SNumber2:=htonl(StrToInt(FV_Date1_S));
      sHead.SNumber3:=htonl(StrToInt(FV_Date2_S));
      stream3.Write(sHead,20);
      FillChar(sHead,20,0);
      if stream3.WaitForData(5000) then
      begin
        stream3.ReadBuffer(sHead,20);
      end;
      stream3.Free;
    end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
      var
        RecvSize1,RecvSize2,DeSize:integer;
        commandI,MessageSize:LongWord;
    begin
      RecvSize1:=0;
      RecvSize2:=0;
      FillChar(cHead,SizeOf(cHead),0);  RecvSize1:=socket.ReceiveBuf(cHead,SizeOf(cHead));
      commandI:=ntohl(cHead.CommandId);
      MessageSize:=ntohl(cHead.MessageLength);
      if commandI=SGIP_BIND then
      begin
        memo1.Lines.Add('*********************接收到Bind请求*********************');
        FillChar(cBind,SizeOf(cBind),0);
        FillChar(cBind_Resp,SizeOf(cBind_Resp),0);
        RecvSize2:=Socket.ReceiveBuf(cBind,MessageSize-RecvSize1);
        if (RecvSize2+RecvSize1)<>MessageSize then
        begin
          memo1.Lines.Add('**********************bind数据接收错误*******************');
          exit;
        end;
        RecvSize2:=0;RecvSize1:=0;
        cHead.CommandId:=htonl(SGIP_BIND_RESP);
        cHead.MessageLength:=htonl(sizeof(cHead)+sizeof(cBind_Resp));
        cBind_Resp.Result:=0;
        RecvSize1:=Socket.SendBuf(cHead,SizeOf(cHead));
        RecvSize2:=Socket.SendBuf(cBind_Resp,SizeOf(cBind_Resp));
        if (RecvSize1+RecvSize2)<>ntohl(cHead.MessageLength) then
        begin
          memo1.Lines.Add('**********************响应bind请求错误***********************');
          exit;
        end;
      end
      else
      if commandI=SGIP_DELIVER then
      begin
        memo1.Lines.Add('********************接收到SGIP_DELIVER请求********************');
        DeSize:=SizeOf(cDeliver);
        FillChar(cDeliver,SizeOf(cDeliver),0);
        FillChar(cDeliver_Resp,SizeOf(cDeliver_Resp),0);
        RecvSize2:=Socket.ReceiveBuf(cDeliver,MessageSize-RecvSize1);
        if (RecvSize2+RecvSize1)<>MessageSize then
        begin
          memo1.Lines.Add('**********************SGIP_DELIVER数据接收错误*******************');
          exit;
        end;
        RecvSize2:=0;RecvSize1:=0;
        cHead.CommandId:=htonl(SGIP_DELIVER_RESP);
        cHead.MessageLength:=htonl(sizeof(cHead)+sizeof(cDeliver_Resp));
        cDeliver_Resp.Result:=0;
        RecvSize1:=Socket.SendBuf(cHead,SizeOf(cHead));
        RecvSize2:=Socket.SendBuf(cDeliver_Resp,SizeOf(cDeliver_Resp));
        if (RecvSize1+RecvSize2)<>ntohl(cHead.MessageLength) then
        begin
          memo1.Lines.Add('**********************响应SGIP_DELIVER请求错误***********************');
          exit;
        end;
      end
      else
      if commandI=SGIP_UNBIND then
      begin
        cHead.CommandId:=htonl(SGIP_UNBIND_RESP);
        cHead.MessageLength:=htonl(sizeof(cHead));
        memo1.Lines.Add('响应SGIP_UNBIND***************************');
        RecvSize2:=Socket.SendBuf(cHead,sizeOf(cHead));
        if RecvSize2<>ntohl(cHead.MessageLength) then
        begin
          memo1.Lines.Add('**********************SGIP_UNBIND发送错误*****************');
          exit;
        end;
      end
      else
      begin
      end;
    end;
    end.
      

  3.   

    //..............................................................
    //协议
    unit xy;interface
    uses
      SysUtils;
    const                                       
      SGIP_BIND             =$1;            //对客户端验证
      SGIP_BIND_RESP =$80000001;     //服务端返回验证请求
      SGIP_UNBIND         =$2;            //断开连接
      SGIP_UNBIND_RESP      =$80000002;     //返回断开连接状态
      SGIP_SUBMIT         =$3;            //向SMG提交MT短消息
      SGIP_SUBMIT_RESP      =$80000003;     //返回SP提交MT短消息状态
      SGIP_DELIVER         =$4;            //SMG向SP发送一条MO短消息
      SGIP_DELIVER_RESP     =$80000004;     //返回SMG状态
      SGIP_REPORT         =$5;            //向SP发送一条先前的submit命令的当前状态
      SGIP_REPORT_RESP =$80000005;     //响应SMG状态
      //以下协议对SP无用
      SGIP_ADDSP         =$6;            //
      SGIP_ADDSP_RESP =$80000006;     //
      SGIP_MODIFYSP         =$7;            //
      SGIP_MODIFYSP_RESP =$80000007;     //
      SGIP_DELETESP         =$8;            //
      SGIP_DELETESP_RESP =$80000008;     //
      SGIP_QUERYROUTE =$9;            //
      SGIP_QUERYROUTE_RESP =$80000009;     //
      SGIP_ADDTELESEG =$a;            //
      SGIP_ADDTELESEG_RESP =$8000000a;     //
      SGIP_MODIFYTELESEG =$b;            //
      SGIP_MODIFYTELESEG_RESP =$8000000b;     //
      SGIP_DELETETELESEG =$c;                    //
      SGIP_DELETETELESEG_RESP =$8000000c;     //
      SGIP_ADDSMG         =$d;            //
      SGIP_ADDSMG_RESP =$8000000d;     //
      SGIP_MODIFYSMG =$e;            //
      SGIP_MODIFYSMG_RESP =$0000000e;     //
      SGIP_DELETESMG =$f;            //
      SGIP_DELETESMG_RESP =$8000000f;     //
      SGIP_CHECKUSER =$10;           //
      SGIP_CHECKUSER_RESP =$80000010;     //
      SGIP_USERRPT         =$11;           //
      SGIP_USERRPT_RESP =$80000011;     //
      SGIP_TRACE         =$1000;         //
      SGIP_TRACE_RESP =$80001000;     //
    type
      TEMPTY=Record //空纪录
      end;
      //消息头
      SGIPHead=Record
        MessageLength       :longword;              //消息的总长度(字节)
        CommandId           :longword;              //命令ID
        SNumber1,SNumber2,SNumber3:longword;        //序列号
      end;
      //消息体
      XBind=Record                            //
        LonginType          :byte;
        LonginPass          :array[0..15] of char;
        LonginName          :array[0..15] of char;
        Reserve             :array[0..7] of char;
      end;
      Bind_Resp=Record
        Result              :byte;
        Reserve             :array[0..7] of char;
      end;
      //
      Unbind=TEMPTY;
      Unbind_Resp=TEMPTY;
      //
      TelCount=record                     //手机号码
        TelN  :array[0..20] of char;
      end;
      XSubmit=Record
        SPNumber            :array[0..20] of char;
        ChargeNumber        :array[0..20] of char;
        UserCount           :byte;               //1-100
        UserNumber          :array[0..20] of char;//TelCount;  //长度为UserCount
        CorpID              :array[0..4] of char;
        ServiceType         :array[0..9] of char;
        FeeType             :byte;
        FeeValue            :array[0..5] of char;
        GivenValue          :array[0..5] of char;
        AgentFlag           :byte;
        MOrelatetoMTFlag    :byte;
        Priority            :byte;
        ExpireTime          :array[0..15] of char;
        ScheduleTime        :array[0..15] of char;
        ReportFlag          :byte;
        TP_pid              :byte;
        TP_udhi             :byte;
        MessageCoding       :byte;
        MessageType         :byte;
        MessageLength       :longword;
        MessageContent      :array[0..160] of char;  //长度为  MessageLength;
        Reserve             :array[0..7] of char;
      end;
      Submit_Resp=Record
        Result              :byte;
        Reserve             :array[0..7] of char;
      end;
      //
      XDeliver=Record
        UserNumber          :array[0..20] of char;
        SPNumber            :array[0..27] of char;
        {TP_pid              :byte;
        TP_udhi             :byte;
        MessageCoding       :byte;
        MessageLength       :longword;}
        MessageContent      :array[0..254] of char;  //长度为  MessageLength;
        Reserver            :array[0..7] of char;
      end;
      Deliver_Resp=Record
        Result              :byte;
        Reserve             :array[0..7] of char;
      end;  //
      XReport=Record
        SubSequNumber1,SubSequNumber2,SubSequNumber3        :longword;
        ReportType          :byte;
        UserNumber          :array[0..20] of char;
        State               :byte;
        ErrorCode           :byte;
        Reserve             :array[0..7] of char;
      end;
      Report_Resp=Record
        Result              :byte;
        Reserve             :array[0..7] of char;
      end;implementation
    end.
      

  4.   


    //、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、//
    服务端
    unit main;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, xy, ScktComp, StdCtrls,winsock;type
      
      TForm1 = class(TForm)
        Memo1: TMemo;
        ServerSocket1: TServerSocket;
        procedure ServerSocket1ClientRead(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ServerSocket1ClientError(Sender: TObject;
          Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
          var ErrorCode: Integer);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
      type
        SendPack = packed record
          head:  SGIPHead;
          resp:  Bind_Resp;
        end;
      var
        ReHead:SGIPHead;
        sresp:Bind_Resp;
        ReBind:xBind;
        ReDeliver:XDeliver;
        ReReport:XReport;
        i1,i2:integer;
        str:string;
        S_Number1,S_Number2,S_Number3,longI1:longword;
        s_Pack:SendPack;
    begin
      fillchar(sresp,sizeof(sresp),0);
      fillchar(ReHead,sizeof(ReHead),0);
      i1:=Socket.ReceiveBuf(ReHead,sizeof(ReHead));
      if i1<>sizeof(ReHead) then
      begin
        memo1.Lines.Add('Recv message Error exit');
        exit;
      end;
      S_Number1:=ReHead.SNumber1;
      S_Number2:=ReHead.SNumber2;
      S_Number3:=ReHead.SNumber3;
      ReHead.MessageLength:=ntohl(ReHead.MessageLength);
      ReHead.CommandId:=ntohl(ReHead.CommandId);
      ReHead.SNumber1:=ntohl(ReHead.SNumber1);
      ReHead.SNumber2:=ntohl(ReHead.SNumber2);
      ReHead.SNumber3:=ntohl(ReHead.SNumber3);
      memo1.Lines.Add('read SMG message');
      memo1.Lines.Add(inttostr(ReHead.MessageLength));
      memo1.Lines.Add(inttostr(ReHead.CommandId));
      memo1.Lines.Add(inttostr(ReHead.SNumber1));
      memo1.Lines.Add(inttostr(ReHead.SNumber2));
      memo1.Lines.Add(inttostr(ReHead.SNumber3));
      if ReHead.CommandId=SGIP_UNBIND then
      begin            //断开连接
        FillChar(ReHead,SizeOf(ReHead),0);
        ReHead.MessageLength:=htonl(SizeOf(ReHead));
        ReHead.CommandId:=htonl(SGIP_UNBIND_RESP);
        ReHead.SNumber1:=S_Number1;
        ReHead.SNumber2:=S_Number2;
        ReHead.SNumber3:=S_Number3;
        i1:=socket.SendBuf(ReHead,sizeof(ReHead));
        if i1<>sizeof(ReHead) then
          memo1.Lines.Add('Send SGIP_UNBIND_Resp Error')
        else
          memo1.Lines.Add('Send SGIP_UNBIND_Resp OK');
      end
      else if ReHead.CommandId=SGIP_BIND then
      begin           //SMG向SP发送一条MO短消息
        FillChar(s_Pack,SizeOf(s_Pack),0);
        FillChar(ReBind,SizeOf(ReBind),0);
        socket.ReceiveBuf(ReBind,SizeOf(ReBind));
        s_Pack.head.MessageLength:=htonl(SizeOf(s_Pack));
        s_Pack.head.CommandId:=htonl(SGIP_BIND_RESP);
        s_Pack.head.SNumber1:=S_Number1;
        s_Pack.head.SNumber2:=S_Number2;
        s_Pack.head.SNumber3:=S_Number3;
        s_Pack.resp.Result:=0;
        i1:=socket.SendBuf(s_Pack,SizeOf(s_Pack));
        if i1<>SizeOf(s_Pack) then
          memo1.Lines.Add('send SGIP_Bind_Resp Error')
        else
          memo1.Lines.Add('Send SGIP_bind_Resp');
      end
      else if ReHead.CommandId=SGIP_DELIVER then
      begin
        FillChar(s_Pack,SizeOf(s_Pack),0);
        FillChar(ReDeliver,SizeOf(ReDeliver),0);
        Socket.ReceiveBuf(ReDeliver,SizeOf(ReDeliver));
        s_Pack.head.MessageLength:=htonl(SizeOf(s_Pack));
        s_Pack.head.CommandId:=htonl(SGIP_DELIVER_RESP);
        s_Pack.head.SNumber1:=S_Number1;
        s_Pack.head.SNumber2:=S_Number2;
        s_Pack.head.SNumber3:=S_Number3;
        s_Pack.resp.Result:=0;
        if socket.SendBuf(s_Pack,SizeOf(s_Pack)) <>SizeOf(s_Pack) then
          memo1.Lines.Add('send SGIP_DELIVER_RESP Error')
        else
          memo1.Lines.Add('Send SGIP_DELIVER_RESP OK');
        memo1.Lines.Add(ReDeliver.UserNumber);
        memo1.Lines.Add(ReDeliver.SPNumber);
        //longI1:=ntohl(ReDeliver.MessageLength);
        //memo1.Lines.Add(inttostr(longI1)+'   '+inttostr(ReDeliver.MessageLength));
        memo1.Lines.Add(ReDeliver.MessageContent);
      end
      else  if ReHead.CommandId=SGIP_REPORT then
      begin
        FillChar(s_Pack,SizeOf(s_Pack),0);
        FillChar(ReReport,SizeOf(ReReport),0);
        Socket.ReceiveBuf(ReReport,SizeOf(ReReport));
        s_Pack.head.MessageLength:=htonl(SizeOf(s_Pack));
        s_Pack.head.CommandId:=htonl(SGIP_REPORT_RESP);
        s_Pack.head.SNumber1:=S_Number1;
        s_Pack.head.SNumber2:=S_Number2;
        s_Pack.head.SNumber3:=S_Number3;
        s_Pack.resp.Result:=0;
        if socket.SendBuf(s_Pack,SizeOf(s_Pack)) <>SizeOf(s_Pack) then
          memo1.Lines.Add('send SGIP_Bind_Resp Error')
        else
          memo1.Lines.Add('Send SGIP_bind_Resp');
        memo1.Lines.Add(ReReport.UserNumber);
        memo1.Lines.Add(inttostr(ReReport.State));
      end;
    end;
    procedure TForm1.ServerSocket1ClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    var
      errorMsg:string;
    begin
      case ErrorEvent of
        eeGeneral:    errorMsg:='eeGeneral';
        eeSend:   errorMsg:='eeSend';
        eeReceive:    errorMsg:='eeReceive';
        eeConnect:    errorMsg:='eeConnect';
        eeDisconnect: errorMsg:='eeDisconnect';
        eeAccept:     errorMsg:='eeAccept';
      end;
      ErrorCode:=0;
      Memo1.Lines.Add('Socket Error:'+errorMsg);
    end;end.