首页 > 编程 > Delphi > 正文

SGIP的delphi原码

2019-11-18 18:39:16
字体:
来源:转载
供稿:网友
 

在网上找了好长时间,也没有发现有SGip的例子,伤感之余,终于做了一个Delphi6.0的SGIP例子
包含了一个服务端和一个客户端,协议共用,服务端为非阻塞长连接,客户端为阻塞短连接,
程序写的很乱,风格也很差,希望高手多多指教 
dulcet99@163.com,dulcet99@sina.com

file://客户端
unit TestMain;

interface

uses
  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 }
    file://客户端协议定义
    sHead:              SGIPHead;       file://消息头定义
    sBind:              XBind;          file://连接请求验证
    sBind_Resp:         Bind_Resp;      file://响应连接请求验证
    sSubmit:            XSubmit;        file://SP->SMG提交短信
    sSubmit_Resp:       Submit_Resp;    file://SMG响应SP提交的短信状态
    sDeliver:           XDeliver;       file://SMG->SP提交短信
    sDeliver_Resp:     Deliver_Resp;  file://SP响应SMG提交的短信状态
    sReport:            XReport;        file://SMG->SP先前的短信状态
    sReport_Resp:       Report_Resp;    file://响应命令执行状况
    file://服务端协议定义
    cHead:              SGIPHead;       file://消息头定义
    cBind:              XBind;          file://连接请求验证
    cBind_Resp:         Bind_Resp;      file://响应连接请求验证
    cSubmit:            XSubmit;        file://SP->SMG提交短信
    cSubmit_Resp:       Submit_Resp;    file://SMG响应SP提交的短信状态
    cDeliver:           XDeliver;       file://SMG->SP提交短信
    cDeliver_Resp:     Deliver_Resp;  file://SP响应SMG提交的短信状态
    cReport:            XReport;        file://SMG->SP先前的短信状态
    cReport_Resp:       Report_Resp;    file://响应命令执行状况
  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;

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);
file://type
  {abc=packed record
    head:SGIPHead;
    submit:xSubmit;
  end;}
var
  FV_Date1_S,FV_Date2_S:string;
  i,SendSize:integer;
  file://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;               file://1-100
    {for i:=1 to UserCount do
    begin
      file://strpcopy(UserNumber[i-1].TelN,'8613065073355');//+T_Tel);//          :array of TelCount;  file://长度为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);  file://长度为  MessageLength;
    file://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;
  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 ..............');
    file://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.

 

 

//..............................................................
file://协
unit xy;

interface
uses
  SysUtils;
const                                      
  SGIP_BIND             =$1;            file://对客户端验证
  SGIP_BIND_RESP =$80000001;     file://服务端返回验证请求
  SGIP_UNBIND         =$2;            file://断开连接
  SGIP_UNBIND_RESP      =$80000002;     file://返回断开连接状态
  SGIP_SUBMIT         =$3;            file://向SMG提交MT短消息
  SGIP_SUBMIT_RESP      =$80000003;     file://返回SP提交MT短消息状态
  SGIP_DELIVER         =$4;            file://SMG向SP发送一条MO短消息
  SGIP_DELIVER_RESP     =$80000004;     file://返回SMG状态
  SGIP_REPORT         =$5;            file://向SP发送一条先前的submit命令的当前状态
  SGIP_REPORT_RESP =$80000005;     file://响应SMG状态
  file://以下协议对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 file://空纪录
  end;
  file://消息头
  SGIPHead=Record
    MessageLength       :longword;              file://消息的总长度(字节)
    CommandId           :longword;              file://命令ID
    SNumber1,SNumber2,SNumber3:longword;        file://序列号
  end;
  file://消息体
  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                     file://手机号码
    TelN  :array[0..20] of char;
  end;
  XSubmit=Record
    SPNumber            :array[0..20] of char;
    ChargeNumber        :array[0..20] of char;
    UserCount           :byte;               file://1-100
    UserNumber          :array[0..20] of char;//TelCount;  file://长度为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;  file://长度为  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;  file://长度为  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.

 


file://、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、//
服务端
unit main;

interface

uses
  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            file://断开连接
    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           file://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);
    file://longI1:=ntohl(ReDeliver.MessageLength);
    file://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.


上一篇:Delphi代码风格约定

下一篇:两种Delphi实现Singleton模式方法

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
学习交流
热门图片

新闻热点

疑难解答

图片精选

网友关注