Nachdem ich lange im Internet gesucht hatte, konnte ich kein SGip-Beispiel finden. Ich war traurig und habe schließlich ein SGIP-Beispiel für Delphi6.0 erstellt.
Enthält einen Server und einen Client, das Protokoll wird gemeinsam genutzt, der Server ist eine nicht blockierende lange Verbindung und der Client ist eine blockierende kurze Verbindung.
Das Programm ist sehr chaotisch und der Stil ist sehr schlecht. Ich hoffe, Experten können mir einen Rat geben.
([email protected],[email protected])
file://client
Einheit TestMain;
Schnittstelle
verwendet
Windows, Nachrichten, SysUtils, Varianten, Klassen, Grafiken, Steuerelemente, Formulare,
Dialoge, 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='Ich habe deinen Namen in den Himmel geschrieben und er wurde nicht vom Wind weggetragen';
Typ
TForm1 = Klasse(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);
Privat
{Private Erklärungen}
öffentlich
{Öffentliche Erklärungen}
file://Client-Protokolldefinition
sHead: SGIHead; file://Nachrichtenheaderdefinition
sBind: XBind; file://Überprüfung der Verbindungsanforderung
sBind_Resp: Bind_Resp; file://Antwort auf die Überprüfung der Verbindungsanforderung
sSubmit: XSubmit; file://SP->SMG SMS senden
sSubmit_Resp: Submit_Resp; file://SMG antwortet auf den vom SP übermittelten SMS-Status
sDeliver: XDeliver; file://SMG->SP SMS senden
sDeliver_Resp: Deliver_Resp; file://SP antwortet auf den von SMG übermittelten SMS-Status
sReport: XReport; file://SMG->SP vorheriger SMS-Status
sReport_Resp: Report_Resp; file://Response-Befehlsausführungsstatus
file://server Protokolldefinition
cHead: SGIHead; file://Nachrichtenheaderdefinition
cBind: XBind; file://Überprüfung der Verbindungsanforderung
cBind_Resp: Bind_Resp; file://Antwort auf die Überprüfung der Verbindungsanforderung
cSubmit: XSubmit; file://SP->SMG SMS senden
cSubmit_Resp: Submit_Resp; file://SMG antwortet auf den vom SP übermittelten SMS-Status
cDeliver: XDeliver; file://SMG->SP SMS senden
cDeliver_Resp: Deliver_Resp; file://SP antwortet auf den von SMG übermittelten SMS-Status
cReport: XReport; file://SMG->SP vorheriger SMS-Status
cReport_Resp: Report_Resp; file://Response-Befehlsausführungsstatus
Ende;
var
Form1: TForm1;
Durchführung
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
beginnen
ClientSocket1.Active:=false;
wenn ClientSocket1.Active dann
memo1.Lines.Add('Herunterfahren des Clients fehlgeschlagen')
anders
memo1.Lines.Add('Client erfolgreich geschlossen');
Ende;
procedure TForm1.Button1Click(Sender: TObject);
beginnen
ClientSocket1.Active:=true;
wenn ClientSocket1.Active dann
memo1.Lines.Add('Client erfolgreich geöffnet')
anders
memo1.Lines.Add('Client-Eröffnung fehlgeschlagen');
Ende;
procedure TForm1.Button6Click(Sender: TObject);
beginnen
ServerSocket1.Active:=true;
wenn ServerSocket1.Active dann
memo1.Lines.Add('Server erfolgreich geöffnet')
anders
memo1.Lines.Add('Eröffnung des Servers fehlgeschlagen');
Ende;
procedure TForm1.Button5Click(Sender: TObject);
beginnen
ServerSocket1.Active:=false;
wenn ServerSocket1.Active dann
memo1.Lines.Add('Herunterfahren des Servers fehlgeschlagen')
anders
memo1.Lines.Add('Server erfolgreich geschlossen');
Ende;
procedure TForm1.Button3Click(Sender: TObject);
var
FV_Date1_S,FV_Date2_S: string;
str_i,SendSize:integer;
stream1:TWinSocketStream;
abc,bc:longWord;
beginnen
stream1:=TWinSocketStream.Create(ClientSocket1.Socket,30000);
memo1.Lines.Add('------------------BIND-Anfrage an den Server senden------------------ --');
Wenn nicht ClientSocket1.Active, dann
beginnen
memo1.Lines.Add('Der Client ist nicht geöffnet');
Ausfahrt;
Ende;
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-Anfrage wurde gesendet-------------------- ------ -');
wenn stream1.WaitForData(5000) dann
beginnen
fillchar(cHead,sizeof(cHead),0);
fillchar(cbind_resp,sizeof(cBind_Resp),0);
stream1.ReadBuffer(cHead,sizeof(cHead));
stream1.ReadBuffer(cBind_resp,sizeof(cBind_resp));
Ende;
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;
Ende;
procedure TForm1.Button4Click(Sender: TObject);
Datei://Typ
{abc=gepackter Datensatz
head:SGIPHead;
einreichen:xSubmit;
Ende;}
var
FV_Date1_S,FV_Date2_S: string;
i,SendSize:integer;
file://xxx:abc;
stream2:twinsocketstream;
abc,bc:langwort;
Zeile1,Zeile2:Langwort;
beginnen
stream2:=twinsocketstream.Create(clientsocket1.Socket,5000);
SendSize:=0;
memo1.Lines.Add('----------submit----------------- ---------');
Wenn nicht ClientSocket1.Active, dann
beginnen
memo1.Lines.Add('------------------Der Client ist nicht geöffnet, Übermittlung fehlgeschlagen-------------');
Ausfahrt;
Ende;
DateTimeToString(FV_Date1_S,'mmddhhnnss',now);
DateTimeToString(FV_Date2_S,'zzz',now);
FillChar(sSubmit,sizeof(sSubmit),0);
FillChar(sHead,sizeof(sHead),0);
mit ssubmit do
beginnen
strpcopy(SPNumber,'4488');//;
ChargeNumber :='8613188890924';
Benutzeranzahl :=1; file://1-100
{for i:=1 to UserCount do
beginnen
file://strpcopy(UserNumber[i-1].TelN,'8613065073355');//+T_Tel);// :array of TelCount file://length ist UserCount
Benutzernummer[i-1].TelN:='8613011725853';
Ende;}
Benutzernummer:='8613188890924';
CorpID:='41027';//CorpID:='4488';//strpcopy(CorpID,FV_corpID);
ServiceType:='4488';//FV_SPNumber);//'4488';
Gebührentyp :=1;
Gebührenwert :='0';
GivenValue :='0';
AgentFlag :=0;
MOrelatetoMTFlag :=2;
Priorität :=0;
ExpireTime :='';
ScheduleTime :='';
ReportFlag :=1;
TP_pid :=0;
tp_udhi :=0;
Nachrichtencodierung :=15;
Nachrichtentyp :=0;
MessageLength :=htonl(161);
strpcopy(MessageContent,T_msg); file://length ist MessageLength;
file://Reserve :='';
Ende;
{line1:=sizeof(sHead);
line2:=sizeof(sSubmit);}
mit sHead tun
beginnen
abc:=htonl(FV_SNumber);
MessageLength:=htonl(sizeof(sHead)+sizeof(sSubmit)-3);
CommandId:=htonl(SGIP_Submit);
SNummer1:=abc;
SNumber2:=htonl(StrToInt(FV_Date1_S));
SNumber3:=htonl(StrToInt(FV_Date2_S));
Ende;
line1:=stream2.Write(shead,sizeof(shead));
line2:=stream2.Write(sSubmit,sizeof(sSubmit)-3);
wenn stream2.WaitForData(5000) dann
beginnen
fillchar(cHead,sizeof(cHead),0);
fillchar(cSubmit_Resp,sizeof(cSubmit_Resp),0);
memo1.Lines.Add('read send Head ............');
versuchen
stream2.ReadBuffer(cHead,sizeof(cHead));
stream2.ReadBuffer(cSubmit_Resp,sizeof(cSubmit_Resp));
außer
auf e:Exception do
memo1.Lines.Add(e.Message);
Ende;
memo1.Lines.Add('read subscribe csubmit_resp ............');
file://stream2.ReadBuffer(cBind_Resp,sizeof(cBind_resp));
Ende;
stream2.Free;
Ende;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
commandI,PackSize:Longword;
Recv1I,Recv2I:integer;
beginnen
FillChar(sHead,sizeof(sHead),0);
FillChar(sBind,sizeof(sBind),0);
Recv1I:=socket.ReceiveBuf(sHead,sizeof(sHead));
commandI:=ntohl(sHead.CommandId);
PackSize:=ntohl(sHead.MessageLength);
wenn commandI=SGIP_UNBIND_RESP dann
beginnen
memo1.Lines.Add('------------------SGIP_UNBIND_RESP-Anfrage empfangen------------------');
Ausfahrt;
Ende;
Recv2I:=socket.ReceiveBuf(sBind,sizeof(sBind));
wenn commandI=SGIP_BIND_RESP dann
memo1.Lines.Add('------SGIP_BIND_RESP------------------')
anders
wenn commandI=SGIP_SUBMIT_RESP dann
memo1.Lines.Add('-----------SGIP_SUBMIT_RESP-------------')
anders
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-------------------');
Ende;
procedure TForm1.Button7Click(Sender: TObject);
var
FV_Date1_S,FV_Date2_S: string;
stream3:TWinSocketStream;
beginnen
Stream3:=TWinSocketStream.Create(clientSocket1.Socket,5000);
memo1.Lines.Add('------------------UnBIND-Anfrage an den Server senden------------------ --');
Wenn nicht ClientSocket1.Active, dann
beginnen
memo1.Lines.Add('Der Client ist nicht geöffnet');
stream3.free;
Ausfahrt;
Ende;
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);
wenn stream3.WaitForData(5000) dann
beginnen
stream3.ReadBuffer(sHead,20);
Ende;
stream3.Free;
Ende;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
RecvSize1,RecvSize2,DeSize:integer;
commandI,MessageSize:LongWord;
beginnen
RecvSize1:=0;
RecvSize2:=0;
FillChar(cHead,SizeOf(cHead),0);
RecvSize1:=socket.ReceiveBuf(cHead,SizeOf(cHead));
commandI:=ntohl(cHead.CommandId);
MessageSize:=ntohl(cHead.MessageLength);
wenn commandI=SGIP_BIND dann
beginnen
memo1.Lines.Add('**************************Received Bind request**************** ** ***');
FillChar(cBind,SizeOf(cBind),0);
FillChar(cBind_Resp,SizeOf(cBind_Resp),0);
RecvSize2:=Socket.ReceiveBuf(cBind,MessageSize-RecvSize1);
if (RecvSize2+RecvSize1)<>MessageSize then
beginnen
memo1.Lines.Add('*************************Fehler beim Empfang der Bindungsdaten******************** ***** **');
Ausfahrt;
Ende;
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
beginnen
memo1.Lines.Add('****************************Fehler in der Antwort auf die Bindungsanforderung************* ********* ******');
Ausfahrt;
Ende;
Ende
anders
wenn commandI=SGIP_DELIVER dann
beginnen
memo1.Lines.Add('**************************SGIP_DELIVER-Anfrage erhalten **************** ******** *');
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
beginnen
memo1.Lines.Add('****************************SGIP_DELIVER Datenempfangsfehler*************** ********* **');
Ausfahrt;
Ende;
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
beginnen
memo1.Lines.Add('****************************Antwort auf SGIP_DELIVER-Anfragefehler****************** ********** ******');
Ausfahrt;
Ende;
Ende
anders
wenn commandI=SGIP_UNBIND dann
beginnen
cHead.CommandId:=htonl(SGIP_UNBIND_RESP);
cHead.MessageLength:=htonl(sizeof(cHead));
memo1.Lines.Add('Antwort auf SGIP_UNBIND******************************');
RecvSize2:=Socket.SendBuf(cHead,sizeOf(cHead));
if RecvSize2<>ntohl(cHead.MessageLength) dann
beginnen
memo1.Lines.Add('****************************SGIP_UNBIND Sendefehler******************** ********' );
Ausfahrt;
Ende;
Ende
anders
beginnen
Ende;
Ende;
Ende.
//................................................ ................ ............
file://Protokoll
Einheit xy;
Schnittstelle
verwendet
SysUtils;
const
SGIP_BIND =$1; file://Client überprüfen
SGIP_BIND_RESP=$80000001; file://server gibt eine Verifizierungsanforderung zurück
SGIP_UNBIND =$2; file://disconnect
SGIP_UNBIND_RESP =$80000002; file://Zurück zum getrennten Status
SGIP_SUBMIT =$3; file://MT-Kurznachricht an SMG senden
SGIP_SUBMIT_RESP =$80000003; file://Return SP Submission MT Short Message Status
SGIP_DELIVER =$4; file://SMG sendet eine MO-Kurznachricht an SP
SGIP_DELIVER_RESP =$80000004; file://return to SMG status
SGIP_REPORT =$5; file://Sendet den aktuellen Status eines vorherigen Submit-Befehls an den SP
SGIP_REPORT_RESP=$80000005; file://Antwort-SMG-Status
file://Die folgenden Protokolle sind für SP nutzlos
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; //
Typ
TEMPTY=Datensatzdatei://leerer Datensatz
Ende;
file://Nachrichtenkopf
SGIPHead=Datensatz
MessageLength:longword file://Die Gesamtlänge der Nachricht (Bytes)
CommandId :longword; file://commandID
SNumber1,SNumber2,SNumber3:longword file://serial number
Ende;
file://Nachrichtentext
XBind=Record //
LonginType :byte;
LonginPass :array[0..15] of char;
LonginName :array[0..15] of char;
Reserve :array[0..7] of char;
Ende;
Bind_Resp=Aufzeichnen
Ergebnis :byte;
Reserve :array[0..7] of char;
Ende;
//
Unbind=TEMPTY;
Unbind_Resp=TEMPTY;
//
TelCount=Datei://Handynummer aufzeichnen
TelN :array[0..20] of char;
Ende;
XSubmit=Aufzeichnen
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://length ist UserCount
CorpID :array[0..4] of char;
ServiceType: array[0..9] of char;
Gebührentyp :byte;
FeeValue: array[0..5] of char;
GivenValue :array[0..5] of char;
AgentFlag :byte;
MOrelatetoMTFlag :byte;
Priorität:Byte;
ExpireTime :array[0..15] of char;
ScheduleTime: array[0..15] of char;
ReportFlag:byte;
TP_pid:byte;
TP_udhi:byte;
Nachrichtencodierung:byte;
Nachrichtentyp:Byte;
MessageLength:longword;
MessageContent :array[0..160] of char file://length ist MessageLength;
Reserve :array[0..7] of char;
Ende;
Submit_Resp=Aufzeichnen
Ergebnis :byte;
Reserve :array[0..7] of char;
Ende;
//
XDeliver=Aufzeichnen
Benutzernummer: array[0..20] of char;
SPNumber :array[0..27] of char;
{TP_pid :byte;
TP_udhi:byte;
Nachrichtencodierung:byte;
MessageLength :longword;}
MessageContent :array[0..254] of char file://length ist MessageLength;
Reserver: array[0..7] of char;
Ende;
Deliver_Resp=Aufzeichnen
Ergebnis :byte;
Reserve :array[0..7] of char;
Ende;
//
XReport=Aufzeichnung
SubSequNumber1,SubSequNumber2,SubSequNumber3 :longword;
ReportType :byte;
Benutzernummer: array[0..20] of char;
Zustand :byte;
Fehlercode:byte;
Reserve :array[0..7] of char;
Ende;
Report_Resp=Aufzeichnen
Ergebnis :byte;
Reserve :array[0..7] of char;
Ende;
Durchführung
Ende.
Datei://,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//
Server
Haupteinheit;
Schnittstelle
verwendet
Windows, Nachrichten, SysUtils, Varianten, Klassen, Grafiken, Steuerelemente, Formulare,
Dialoge, xy, ScktComp, StdCtrls, winsock;
Typ
TForm1 = Klasse(TForm)
Memo1: TMemo;
ServerSocket1: TServerSocket;
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
varErrorCode: Integer);
Privat
{Private Erklärungen}
öffentlich
{Öffentliche Erklärungen}
Ende;
var
Form1: TForm1;
Durchführung
{$R *.dfm}
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
Typ
SendPack = gepackter Datensatz
Kopf: SGIHead;
resp: Bind_Resp;
Ende;
var
ReHead:SGIPHead;
sresp:Bind_Resp;
ReBind:xBind;
ReDeliver:XDeliver;
ReReport:XReport;
i1,i2:Ganzzahl;
str:string;
S_Number1,S_Number2,S_Number3,longI1:longword;
s_Pack:SendPack;
beginnen
fillchar(sresp,sizeof(sresp),0);
fillchar(ReHead,sizeof(ReHead),0);
i1:=Socket.ReceiveBuf(ReHead,sizeof(ReHead));
if i1<>sizeof(ReHead) dann
beginnen
memo1.Lines.Add('Recv message Error exit');
Ausfahrt;
Ende;
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('SMG-Nachricht lesen');
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));
wenn ReHead.CommandId=SGIP_UNBIND dann
begin file://disconnect
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) dann
memo1.Lines.Add('SGIP_UNBIND_Resp-Fehler senden')
anders
memo1.Lines.Add('SGIP_UNBIND_Resp OK senden');
Ende
sonst wenn ReHead.CommandId=SGIP_BIND dann
begin file://SMG sendet eine MO-Kurznachricht an SP
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')
anders
memo1.Lines.Add('SGIP_bind_Resp senden');
Ende
sonst wenn ReHead.CommandId=SGIP_DELIVER dann
beginnen
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) dann
memo1.Lines.Add('send SGIP_DELIVER_RESP Error')
anders
memo1.Lines.Add('SGIP_DELIVER_RESP OK senden');
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);
Ende
sonst wenn ReHead.CommandId=SGIP_REPORT dann
beginnen
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) dann
memo1.Lines.Add('send SGIP_Bind_Resp Error')
anders
memo1.Lines.Add('SGIP_bind_Resp senden');
memo1.Lines.Add(ReReport.UserNumber);
memo1.Lines.Add(inttostr(ReReport.State));
Ende;
Ende;
procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
varErrorCode: Integer);
var
errorMsg:string;
beginnen
Fall ErrorEvent von
eeGeneral: errorMsg:='eeGeneral';
eeSend: errorMsg:='eeSend';
eeReceive: errorMsg:='eeReceive';
eeConnect: errorMsg:='eeConnect';
eeDisconnect: errorMsg:='eeDisconnect';
eeAccept: errorMsg:='eeAccept';
Ende;
Fehlercode:=0;
Memo1.Lines.Add('Socket Error:'+errorMsg);
Ende;
Ende.