Après avoir longuement cherché sur Internet, je n'ai trouvé aucun exemple SGip. J'étais triste et j'ai finalement créé un exemple SGIP pour Delphi6.0.
Contient un serveur et un client, le protocole est partagé, le serveur est une connexion longue non bloquante et le client est une connexion courte bloquante.
Le programme est très compliqué et le style est très médiocre. J'espère que les experts pourront me donner quelques conseils.
([email protected],[email protected])
fichier://client
unité TestMain ;
interface
utilise
Windows, messages, SysUtils, variantes, classes, graphiques, contrôles, formulaires,
Boîtes de dialogue, ScktComp, StdCtrls, ExtCtrls, xy, winsock ;
const
FV_SNumber=3053112345 ;
FV_LoginPass='salut';
FV_LoginName='salut';
FV_SPNumber='12345';
T_Tél='13000000000';
FV_corpID='12345';
T_msg='J'ai écrit ton nom dans le ciel et il n'a pas été emporté par le vent';
taper
TForm1 = classe(TForm)
Mémo1 : TMémo ;
Bouton1 : TButton ;
ClientSocket1 : TClientSocket ;
Bouton3 : TButton ;
Bouton 4 : T Bouton ;
Bouton2 : TButton ;
Bouton5 : TButton ;
Bouton6 : TButton ;
Bouton7 : T Bouton ;
ServerSocket1 : TServerSocket ;
panneau1 : TPanel ;
PProcédure Button2Click (Expéditeur : TObject );
procédure Button1Click (Expéditeur : TObject);
procédure Button6Click (Expéditeur : TObject);
procédure Button5Click (Expéditeur : TObject);
procédure Button3Click (Expéditeur : TObject);
procédure Button4Click (Expéditeur : TObject);
procédure ClientSocket1Read (Expéditeur : TObject ; Socket : TCustomWinSocket) ;
procédure Button7Click (Expéditeur : TObject);
procédure ServerSocket1ClientRead(Expéditeur : TObject ;
Socket : TCustomWinSocket );
privé
{Déclarations privées}
publique
{Déclarations publiques}
fichier://définition du protocole client
sHead : SGIHead ; fichier://Définition de l'en-tête du message
sBind : XBind ; fichier://Vérification de la demande de connexion
sBind_Resp : Bind_Resp ; fichier://Réponse à la vérification de la demande de connexion
sSoumettre : XSoumettre ; fichier://SP->SMG soumettre un SMS
sSubmit_Resp : Submit_Resp ; file://SMG répond au statut du SMS soumis par le SP.
sDeliver : XDeliver ; fichier://SMG->SP soumettre un SMS
sDeliver_Resp : Deliver_Resp ; file://SP répond au statut du SMS soumis par SMG
sReport : XReport ; fichier://SMG->SP état du SMS précédent
sReport_Resp : Report_Resp ; fichier://État d'exécution de la commande de réponse
fichier://définition du protocole du serveur
cHead : SGIHead ; fichier://Définition de l'en-tête du message
cBind : XBind ; fichier://Vérification de la demande de connexion
cBind_Resp : Bind_Resp ; fichier://Réponse à la vérification de la demande de connexion
cSubmit : XSubmit ; fichier://SP->SMG soumettre un SMS
cSubmit_Resp : Submit_Resp ; file://SMG répond au statut SMS soumis par le SP
cDeliver : XDeliver ; fichier://SMG->SP soumettre un SMS
cDeliver_Resp : Deliver_Resp ; file://SP répond au statut SMS soumis par SMG
cReport : XReport ; fichier://SMG->SP état SMS précédent
cReport_Resp : Report_Resp ; fichier://État d'exécution de la commande de réponse
fin;
var
Formulaire1 : TForm1 ;
mise en œuvre
{$R *.dfm}
procédure TForm1.Button2Click(Expéditeur : TObject);
commencer
ClientSocket1.Active :=false ;
si ClientSocket1.Active alors
memo1.Lines.Add('Échec de l'arrêt du client')
autre
memo1.Lines.Add('Client fermé avec succès');
fin;
procédure TForm1.Button1Click(Expéditeur : TObject);
commencer
ClientSocket1.Active :=true ;
si ClientSocket1.Active alors
memo1.Lines.Add('Client ouvert avec succès')
autre
memo1.Lines.Add('Échec de l'ouverture du client');
fin;
procédure TForm1.Button6Click(Expéditeur : TObject);
commencer
ServerSocket1.Active :=true ;
si ServerSocket1.Active alors
memo1.Lines.Add('Serveur ouvert avec succès')
autre
memo1.Lines.Add('Échec de l'ouverture du serveur');
fin;
procédure TForm1.Button5Click(Expéditeur : TObject);
commencer
ServerSocket1.Active :=false ;
si ServerSocket1.Active alors
memo1.Lines.Add('Échec de l'arrêt du serveur')
autre
memo1.Lines.Add('Serveur fermé avec succès');
fin;
procédure TForm1.Button3Click(Expéditeur : TObject);
var
FV_Date1_S,FV_Date2_S : chaîne ;
str_i,SendSize:entier;
flux1:TWinSocketStream;
abc,bc:mot long;
commencer
stream1:=TWinSocketStream.Create(ClientSocket1.Socket,30000);
memo1.Lines.Add('-------------------Envoyer la requête BIND au serveur----------------- --');
sinon ClientSocket1.Active alors
commencer
memo1.Lines.Add('Le client n'est pas ouvert');
sortie;
fin;
DateTimeToString (FV_Date1_S, 'mmjjhnnss', maintenant);
DateTimeToString(FV_Date2_S,'zzz',maintenant);
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('------------------La demande de liaison a été envoyée---------------------------------- ------ -');
si stream1.WaitForData (5000) alors
commencer
fillchar(cHead,sizeof(cHead),0);
fillchar(cbind_resp,sizeof(cBind_Resp),0);
stream1.ReadBuffer(cHead,sizeof(cHead));
stream1.ReadBuffer(cBind_resp,sizeof(cBind_resp));
fin;
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));
flux1.Gratuit ;
fin;
procédure TForm1.Button4Click(Expéditeur : TObject);
fichier://type
{abc=enregistrement compressé
tête : SGIPHête ;
soumettre:xSoumettre;
fin;}
var
FV_Date1_S,FV_Date2_S : chaîne ;
je,SendSize:entier;
fichier://xxx:abc;
flux2 : twinsocketstream ;
abc,bc:mot long;
ligne1, ligne2 : mot long ;
commencer
stream2:=twinsocketstream.Create(clientsocket1.Socket,5000);
Taille d'envoi :=0 ;
memo1.Lines.Add('-------------------------submit----------------- ---------');
sinon ClientSocket1.Active alors
commencer
memo1.Lines.Add('------------------Le client n'est pas ouvert, échec de la soumission-------------');
sortie;
fin;
DateTimeToString (FV_Date1_S, 'mmjjhnnss', maintenant);
DateTimeToString(FV_Date2_S,'zzz',maintenant);
FillChar(sSoumettre,sizeof(sSoumettre),0);
FillChar(sHead,sizeof(sHead),0);
avec ssubmit faire
commencer
strpcopy(SPNumber,'4488');//;
Numéro de charge :='8613188890924';
Nombre d'utilisateurs :=1 ; fichier://1-100
{pour i:=1 à UserCount faire
commencer
file://strpcopy(UserNumber[i-1].TelN,'8613065073355');//+T_Tel);// : tableau de TelCount file://length est UserCount ;
Numéro d'utilisateur[i-1].TelN:='8613011725853';
fin;}
Numéro d'utilisateur : = '8613188890924' ;
IDCorp :='41027';//IDCorp:='4488';//strpcopy(CorpID,FV_corpID);
Type de service :='4488';//FV_SPNumber);//'4488';
Type de frais :=1 ;
Valeur des frais :='0';
ValeurDonnée :='0';
AgentFlag :=0;
MOrelatifàMTFlag :=2;
Priorité :=0 ;
Heure d'expiration :='';
HeureHoraire :='';
ReportFlag :=1;
TP_pid :=0;
tp_udhi :=0;
Codage des messages :=15 ;
Type de message :=0;
Longueur du message :=htonl(161);
strpcopy(MessageContent,T_msg); fichier://longueur est MessageLength ;
fichier://Réserve :='';
fin;
{line1:=sizeof(sHead);
line2:=sizeof(sSubmit);}
avec sHead faire
commencer
abc:=htonl(FV_SNumber);
MessageLength:=htonl(sizeof(sHead)+sizeof(sSubmit)-3);
CommandId:=htonl(SGIP_Submit);
SNuméro1 :=abc ;
SNumber2:=htonl(StrToInt(FV_Date1_S));
SNumber3:=htonl(StrToInt(FV_Date2_S));
fin;
line1:=stream2.Write(shead,sizeof(shead));
line2:=stream2.Write(sSubmit,sizeof(sSubmit)-3);
si stream2.WaitForData (5000) alors
commencer
fillchar(cHead,sizeof(cHead),0);
fillchar(cSubmit_Resp,sizeof(cSubmit_Resp),0);
memo1.Lines.Add('read submit Head ............');
essayer
stream2.ReadBuffer(cHead,sizeof(cHead));
stream2.ReadBuffer(cSubmit_Resp,sizeof(cSubmit_Resp));
sauf
sur e:exception faire
memo1.Lines.Add(e.Message);
fin;
memo1.Lines.Add('read submit csubmit_resp ............');
fichier://stream2.ReadBuffer(cBind_Resp,sizeof(cBind_resp));
fin;
stream2.Gratuit ;
fin;
procédure TForm1.ClientSocket1Read(Expéditeur : TObject;
Socket : TCustomWinSocket );
var
commandeI,PackSize:Longword;
Recv1I,Recv2I :entier ;
commencer
FillChar(sHead,sizeof(sHead),0);
FillChar(sBind,sizeof(sBind),0);
Recv1I:=socket.ReceiveBuf(sHead,sizeof(sHead));
commandI:=ntohl(sHead.CommandId);
PackSize:=ntohl(sHead.MessageLength);
si commandI=SGIP_UNBIND_RESP alors
commencer
memo1.Lines.Add('------------------Demande SGIP_UNBIND_RESP reçue------------------');
sortie;
fin;
Recv2I:=socket.ReceiveBuf(sBind,sizeof(sBind));
si commandI=SGIP_BIND_RESP alors
memo1.Lines.Add('--------------------SGIP_BIND_RESP------------------')
autre
si commandI=SGIP_SUBMIT_RESP alors
memo1.Lines.Add('----------------SGIP_SUBMIT_RESP-------------')
autre
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-------------------');
fin;
procédure TForm1.Button7Click(Expéditeur : TObject);
var
FV_Date1_S,FV_Date2_S : chaîne ;
flux3:TWinSocketStream;
commencer
Stream3:=TWinSocketStream.Create(clientSocket1.Socket,5000);
memo1.Lines.Add('-------------------Envoyer la requête UnBIND au serveur------------------ --');
sinon ClientSocket1.Active alors
commencer
memo1.Lines.Add('Le client n'est pas ouvert');
stream3.free;
sortie;
fin;
DateTimeToString (FV_Date1_S, 'mmjjhnnss', maintenant);
DateTimeToString(FV_Date2_S,'zzz',maintenant);
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);
si stream3.WaitForData (5000) alors
commencer
stream3.ReadBuffer(sHead,20);
fin;
stream3.Gratuit ;
fin;
procédure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket : TCustomWinSocket );
var
RecvSize1,RecvSize2,DeSize:entier;
commandeI,MessageSize:LongWord;
commencer
TailleRecv1 :=0 ;
TailleRec2 :=0 ;
FillChar(cHead,SizeOf(cHead),0);
RecvSize1:=socket.ReceiveBuf(cHead,SizeOf(cHead));
commandI:=ntohl(cHead.CommandId);
MessageSize:=ntohl(cHead.MessageLength);
si commandI=SGIP_BIND alors
commencer
memo1.Lines.Add('************************Demande de liaison reçue****************** ** ***');
FillChar(cBind,SizeOf(cBind),0);
FillChar(cBind_Resp,SizeOf(cBind_Resp),0);
RecvSize2:=Socket.ReceiveBuf(cBind,MessageSize-RecvSize1);
si (RecvSize2+RecvSize1)<>MessageSize alors
commencer
memo1.Lines.Add ('*********************** erreur de réception de données de liaison ****************** ***** **');
sortie;
fin;
TailleRecv2:=0;TailleRecv1:=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));
si (RecvSize1+RecvSize2)<>ntohl(cHead.MessageLength) alors
commencer
memo1.Lines.Add('**********************Erreur en réponse à la demande de liaison*************** ********* ******');
sortie;
fin;
fin
autre
si commandeI=SGIP_DELIVER alors
commencer
memo1.Lines.Add('************************Requête SGIP_DELIVER reçue****************** ******** *');
DeSize:=SizeOf(cDeliver);
FillChar(cDeliver,SizeOf(cDeliver),0);
FillChar(cDeliver_Resp,SizeOf(cDeliver_Resp),0);
RecvSize2:=Socket.ReceiveBuf(cDeliver,MessageSize-RecvSize1);
si (RecvSize2+RecvSize1)<>MessageSize alors
commencer
memo1.Lines.Add('************************Erreur de réception de données SGIP_DELIVER*************** ********* **');
sortie;
fin;
TailleRecv2:=0;TailleRecv1:=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));
si (RecvSize1+RecvSize2)<>ntohl(cHead.MessageLength) alors
commencer
memo1.Lines.Add('************************Réponse à l'erreur de demande SGIP_DELIVER************** ********** ******');
sortie;
fin;
fin
autre
si commandI=SGIP_UNBIND alors
commencer
cHead.CommandId:=htonl(SGIP_UNBIND_RESP);
cHead.MessageLength:=htonl(sizeof(cHead));
memo1.Lines.Add('Réponse à SGIP_UNBIND******************************');
RecvSize2:=Socket.SendBuf(cHead,sizeOf(cHead));
si RecvSize2<>ntohl(cHead.MessageLength) alors
commencer
memo1.Lines.Add('************************SGIP_UNBIND erreur d'envoi****************** ********' );
sortie;
fin;
fin
autre
commencer
fin;
fin;
fin.
//................................................................. ................ ............
fichier://protocole
unité xy;
interface
utilise
SysUtils ;
const
SGIP_BIND =$1 ; fichier://Vérifier le client
SGIP_BIND_RESP=$80000001 ; file://server renvoie la demande de vérification
SGIP_UNBIND =$2; fichier://déconnexion
SGIP_UNBIND_RESP =$80000002 ; fichier://Retour à l'état déconnecté
SGIP_SUBMIT =$3 ; fichier://Soumettre un court message MT à SMG
SGIP_SUBMIT_RESP = 8 000 000 $ ; fichier://Retourner l'état du message court MT de soumission du SP
SGIP_DELIVER =$4 ; file://SMG envoie un court message MO au SP
SGIP_DELIVER_RESP =$80000004 ; fichier://retour au statut SMG
SGIP_REPORT =$5; file://Envoie l'état actuel d'une commande de soumission précédente au SP
SGIP_REPORT_RESP=$80000005 ; fichier://Statut SMG de réponse
file://Les protocoles suivants sont inutiles pour SP
SGIP_ADDSP = 6 $ ; //
SGIP_ADDSP_RESP=8 000 0006 $ ;
SGIP_MODIFYSP = 7 $ ; //
SGIP_MODIFYSP_RESP=8 000 0007 $ ;
SGIP_DELETESP = 8 $ ;
SGIP_DELETESP_RESP=8 000 000 $ ; //
SGIP_QUERYROUTE=$9; //
SGIP_QUERYROUTE_RESP=8 000 0009 $ ;
SGIP_ADDTELESEG=$a;
SGIP_ADDTELESEG_RESP=8 000 000 $a ;
SGIP_MODIFYTELESEG=$b;
SGIP_MODIFYTELESEG_RESP=8 000 000 milliards de dollars ; //
SGIP_DELETETELESEG=$c;
SGIP_DELETETELESEG_RESP=8 000 000 $c; //
SGIP_ADDSMG =$d; //
SGIP_ADDSMG_RESP=8 000 000 $ ; //
SGIP_MODIFYSMG=$e; //
SGIP_MODIFYSMG_RESP=0000000e ; //
SGIP_DELETESMG=$f;
SGIP_DELETESMG_RESP=8 000 000$f; //
SGIP_CHECKUSER=10 $ ; //
SGIP_CHECKUSER_RESP=8 000 0010 $ ;
SGIP_USERRPT = 11 $ ; //
SGIP_USERRPT_RESP=8 0000011 $ ;
SGIP_TRACE = 1 000 $ ; //
SGIP_TRACE_RESP=80001000 $ ;
taper
TEMPTY=Fichier d'enregistrement://enregistrement vide
fin;
fichier://en-tête du message
SGIPHead=Enregistrement
MessageLength:longword; file://La longueur totale du message (octets)
CommandId : mot long ; fichier://commandID
SNumber1,SNumber2,SNumber3 : mot long ; fichier://numéro de série
fin;
fichier://corps du message
XBind=Enregistrement //
LonginType :octet;
LonginPass :array[0..15] de caractères ;
LonginName : array[0..15] de caractères ;
Réserve :array[0..7] de char;
fin;
Bind_Resp=Enregistrer
Résultat :octet;
Réserve :array[0..7] de char;
fin;
//
Délier = TEMPTY ;
Unbind_Resp=TEMPTY;
//
TelCount=enregistrer le fichier://numéro de téléphone portable
TelN :array[0..20] de caractères ;
fin;
XSoumettre=Enregistrer
SPNumber : array[0..20] de caractères ;
ChargeNumber : array[0..20] de caractères ;
Nombre d'utilisateurs :octet ; fichier://1-100
UserNumber : array[0..20] de char;//TelCount file://length est UserCount ;
CorpID : array[0..4] de caractères ;
ServiceType :array[0..9] de char ;
Type de frais :octet;
FeeValue :array[0..5] de char;
GivenValue :array[0..5] de char;
AgentFlag :octet;
MOrelatifàMTFlag :byte;
Priorité : octet ;
ExpireTime :array[0..15] de char;
ScheduleTime :array[0..15] de caractères ;
ReportFlag:octet;
TP_pid : octet ;
TP_udhi : octet ;
Codage de message : octet ;
Type de message : octet ;
Longueur du message : mot long ;
MessageContent : array[0..160] de char ; file://length est MessageLength ;
Réserve :array[0..7] de char;
fin;
Submit_Resp=Enregistrer
Résultat :octet;
Réserve :array[0..7] de char;
fin;
//
XDeliver=Enregistrer
UserNumber : array[0..20] de caractères ;
SPNumber : array[0..27] de caractères ;
{TP_pid :octet;
TP_udhi : octet ;
Codage de message : octet ;
Longueur du message :mot long;}
MessageContent :array[0..254] de char ; file://length est MessageLength ;
Reserver :array[0..7] de char;
fin;
Deliver_Resp=Enregistrement
Résultat :octet;
Réserve :array[0..7] de char;
fin;
//
XReport=Enregistrer
SubSequNumber1,SubSequNumber2,SubSequNumber3 :mot long;
Type de rapport :octet;
UserNumber : array[0..20] de caractères ;
État :octet;
Code d'erreur : octet ;
Réserve :array[0..7] de char;
fin;
Report_Resp=Enregistrement
Résultat :octet;
Réserve :array[0..7] de char;
fin;
mise en œuvre
fin.
déposer://,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//
Serveur
unité principale ;
interface
utilise
Windows, messages, SysUtils, variantes, classes, graphiques, contrôles, formulaires,
Boîtes de dialogue, xy, ScktComp, StdCtrls, winsock ;
taper
TForm1 = classe(TForm)
Mémo1 : TMémo ;
ServerSocket1 : TServerSocket ;
procédure ServerSocket1ClientRead(Expéditeur : TObject ;
Socket : TCustomWinSocket );
procédure ServerSocket1ClientError(Expéditeur : TObject ;
Socket : TCustomWinSocket ; ErrorEvent : TErrorEvent ;
varErrorCode : entier );
privé
{Déclarations privées}
publique
{Déclarations publiques}
fin;
var
Formulaire1 : TForm1 ;
mise en œuvre
{$R *.dfm}
procédure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket : TCustomWinSocket );
taper
SendPack = enregistrement compressé
tête : SGIHead ;
resp: Bind_Resp;
fin;
var
ReTête : SGIPHead ;
sresp:Bind_Resp;
ReBind:xBind;
ReLivrer : XDeliver ;
Rapport : XReport ;
i1,i2 : entier ;
str:chaîne;
S_Number1, S_Number2, S_Number3, longI1 : mot long ;
s_Pack:EnvoyerPack;
commencer
fillchar(sresp,sizeof(sresp),0);
fillchar(ReHead,sizeof(ReHead),0);
i1:=Socket.ReceiveBuf(ReHead,sizeof(ReHead));
si i1<>sizeof(ReHead) alors
commencer
memo1.Lines.Add('Recv message Erreur de sortie');
sortie;
fin;
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('lire le message SMG');
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));
si ReHead.CommandId=SGIP_UNBIND alors
commencer le fichier://déconnecter
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));
si i1<>sizeof(ReHead) alors
memo1.Lines.Add('Envoyer l'erreur SGIP_UNBIND_Resp')
autre
memo1.Lines.Add('Envoyer SGIP_UNBIND_Resp OK');
fin
sinon si ReHead.CommandId=SGIP_BIND alors
commencer le fichier://SMG envoie un court message MO au 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));
si i1<>SizeOf(s_Pack) alors
memo1.Lines.Add('envoyer l'erreur SGIP_Bind_Resp')
autre
memo1.Lines.Add('Envoyer SGIP_bind_Resp');
fin
sinon si ReHead.CommandId=SGIP_DELIVER alors
commencer
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;
si socket.SendBuf(s_Pack,SizeOf(s_Pack)) <>SizeOf(s_Pack) alors
memo1.Lines.Add('envoyer l'erreur SGIP_DELIVER_RESP')
autre
memo1.Lines.Add('Envoyer SGIP_DELIVER_RESP OK');
memo1.Lines.Add(ReDeliver.UserNumber);
memo1.Lines.Add(ReDeliver.SPNumber);
fichier://longI1:=ntohl(ReDeliver.MessageLength);
file://memo1.Lines.Add(inttostr(longI1)+' '+inttostr(ReDeliver.MessageLength));
memo1.Lines.Add(ReDeliver.MessageContent);
fin
sinon si ReHead.CommandId=SGIP_REPORT alors
commencer
FillChar(s_Pack,SizeOf(s_Pack),0);
FillChar (Report, 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;
si socket.SendBuf(s_Pack,SizeOf(s_Pack)) <>SizeOf(s_Pack) alors
memo1.Lines.Add('envoyer l'erreur SGIP_Bind_Resp')
autre
memo1.Lines.Add('Envoyer SGIP_bind_Resp');
memo1.Lines.Add(ReReport.UserNumber);
memo1.Lines.Add(inttostr(ReReport.State));
fin;
fin;
procédure TForm1.ServerSocket1ClientError(Expéditeur : TObject;
Socket : TCustomWinSocket ; ErrorEvent : TErrorEvent ;
varErrorCode : entier );
var
message d'erreur : chaîne ;
commencer
caseErreurÉvénement de
eeGénéral : errorMsg:='eeGénéral';
eeSend : errorMsg :='eeSend';
eeReceive : errorMsg:='eeReceive';
eeConnect : errorMsg :='eeConnect';
eeDisconnect : errorMsg:='eeDisconnect';
eeAccept: errorMsg:='eeAccept';
fin;
Code d'erreur :=0 ;
Memo1.Lines.Add('Erreur de socket :'+errorMsg);
fin;
fin.