WEB开发网
开发学院软件开发Delphi SGIP的delphi原码 阅读

SGIP的delphi原码

 2006-02-04 13:39:07 来源:WEB开发网   
核心提示: 在网上找了好长时间,也没有发现有SGip的例子,SGIP的delphi原码,伤感之余,终于做了一个Delphi6.0的SGIP例子包含了一个服务端和一个客户端,风格也很差,希望高手多多指教(dulcet99@163.com,dulcet99@sina.com)file://客户端unit TestMain;inter
 

在网上找了好长时间,也没有发现有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.

Tags:SGIP delphi

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接