SGIP的delphi原码

Delphi教程 2025-08-09

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