Después de buscar durante mucho tiempo en Internet, no pude encontrar ningún ejemplo de SGip. Me entristecí y finalmente hice un ejemplo de SGIP para Delphi6.0.
Contiene un servidor y un cliente, el protocolo es compartido, el servidor es una conexión larga sin bloqueo y el cliente es una conexión corta con bloqueo.
El programa es muy complicado y el estilo es muy pobre. Espero que los expertos puedan darme algún consejo.
([email protected],[email protected])
archivo://cliente
unidad de prueba principal;
interfaz
usos
Windows, Mensajes, SysUtils, Variantes, Clases, Gráficos, Controles, Formularios,
Diálogos, ScktComp, StdCtrls, ExtCtrls, xy, winsock;
constante
FV_SNúmero=3053112345;
FV_LoginPass='hola';
FV_LoginName='hola';
FV_SPNumber='12345';
T_Tel='13000000000';
FV_corpID='12345';
T_msg='Escribí tu nombre en el cielo y no se lo llevó el viento';
tipo
TForm1 = clase(TForm)
Memo1: TMemo;
Botón1: TBotón;
ClientSocket1: TClientSocket;
Botón3: TBotón;
Botón4: TBotón;
Botón2: TBotón;
Botón5: TBotón;
Botón6: TBotón;
Botón7: TBotón;
ServerSocket1: TServerSocket;
panel1: Panel T;
Procedimiento Button2Click(Remitente: TObject);
procedimiento Button1Click(Remitente: TObject);
procedimiento Button6Click(Remitente: TObject);
procedimiento Button5Click(Remitente: TObject);
procedimiento Button3Click(Remitente: TObject);
procedimiento Button4Click(Remitente: TObject);
procedimiento ClientSocket1Read(Remitente: TObject; Socket: TCustomWinSocket);
procedimiento Button7Click(Remitente: TObject);
procedimiento ServerSocket1ClientRead(Remitente: TObject;
Zócalo: TCustomWinSocket);
privado
{Declaraciones privadas}
público
{Declaraciones públicas}
archivo://definición del protocolo del cliente
sHead: SGIHead; archivo://Definición del encabezado del mensaje
sBind: XBind file://Verificación de solicitud de conexión
sBind_Resp: Bind_Resp; archivo://Respuesta a la verificación de la solicitud de conexión;
sEnviar: XSubmit archivo://SP->SMG enviar SMS;
sSubmit_Resp: Submit_Resp file://SMG responde al estado del SMS enviado por el SP;
sDeliver: XDeliver archivo://SMG->SP enviar SMS
sDeliver_Resp: Deliver_Resp; file://SP responde al estado del SMS enviado por SMG
sReport: XReport archivo://SMG->SP estado del SMS anterior
sReport_Resp: Report_Resp: archivo://estado de ejecución del comando de respuesta;
archivo://definición del protocolo del servidor
cHead: archivo SGIHead://Definición del encabezado del mensaje;
cBind: XBind file://Verificación de solicitud de conexión
cBind_Resp: Bind_Resp file://Respuesta a la verificación de la solicitud de conexión;
cEnviar: XSubmit archivo://SP->SMG enviar SMS;
cSubmit_Resp: Submit_Resp file://SMG responde al estado del SMS enviado por el SP;
cDeliver: XDeliver archivo://SMG->SP enviar SMS;
cDeliver_Resp: Deliver_Resp file://SP responde al estado del SMS enviado por SMG;
cReport: archivo XReport://SMG->SP estado del SMS anterior;
cReport_Resp: Report_Resp archivo: // Estado de ejecución del comando de respuesta;
fin;
var
Formulario1: TForm1;
implementación
{$R*.dfm}
procedimiento TForm1.Button2Click (Remitente: TObject);
comenzar
ClientSocket1.Active:=falso;
si ClientSocket1.Active entonces
memo1.Lines.Add('Error al cerrar el cliente')
demás
memo1.Lines.Add('El cliente se cerró correctamente');
fin;
procedimiento TForm1.Button1Click (Remitente: TObject);
comenzar
ClientSocket1.Active:=verdadero;
si ClientSocket1.Active entonces
memo1.Lines.Add('El cliente se abrió correctamente')
demás
memo1.Lines.Add('Error al abrir el cliente');
fin;
procedimiento TForm1.Button6Click(Remitente: TObject);
comenzar
ServerSocket1.Active:=verdadero;
si ServerSocket1.Active entonces
memo1.Lines.Add('El servidor se abrió correctamente')
demás
memo1.Lines.Add('Error al abrir el servidor');
fin;
procedimiento TForm1.Button5Click(Remitente: TObject);
comenzar
ServerSocket1.Active:=falso;
si ServerSocket1.Active entonces
memo1.Lines.Add('Error al cerrar el servidor')
demás
memo1.Lines.Add('El servidor se cerró correctamente');
fin;
procedimiento TForm1.Button3Click(Remitente: TObject);
var
FV_Date1_S,FV_Date2_S: cadena;
str_i, Tamaño de envío: entero;
flujo1:TWinSocketStream;
abc,bc:palabra larga;
comenzar
flujo1:=TWinSocketStream.Create(ClientSocket1.Socket,30000);
memo1.Lines.Add('-------------------Enviar solicitud BIND al servidor------------------ --');
si no es ClientSocket1.Active entonces
comenzar
memo1.Lines.Add('El cliente no está abierto');
salida;
fin;
DateTimeToString(FV_Date1_S,'mmddhhnnss',ahora);
DateTimeToString(FV_Date2_S,'zzz',ahora);
FillChar(sBind,tamaño de(sBind),0);
FillChar(sHead,tamañode(sHead),0);
str_i:=tamañode(sHead)+tamañode(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.SNúmero1:=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)));
antes de Cristo:=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 solicitud de enlace ha sido enviada-------------------- ------ -');
si flujo1.WaitForData(5000) entonces
comenzar
fillchar(cHead,tamaño de(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)));
antes de Cristo:=ntohl(cHead.CommandId);
memo1.Lines.Add('cHead.CommandId '+inttostr(bc));
antes de Cristo:=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));
flujo1.Gratis;
fin;
procedimiento TForm1.Button4Click (Remitente: TObject);
archivo://tipo
{abc=registro empaquetado
cabeza:SGIPCabeza;
enviar:xEnviar;
fin;}
var
FV_Date1_S,FV_Date2_S: cadena;
i, Tamaño de envío: entero;
archivo://xxx:abc;
flujo2: flujo de doble socket;
abc,bc:palabra larga;
línea1, línea2: palabra larga;
comenzar
flujo2:=twinsocketstream.Create(clientsocket1.Socket,5000);
Tamaño de envío:=0;
memo1.Lines.Add('-------------------------enviar----------------- ---------');
si no es ClientSocket1.Active entonces
comenzar
memo1.Lines.Add('------------------El cliente no está abierto, el envío falló-------------');
salida;
fin;
DateTimeToString(FV_Date1_S,'mmddhhnnss',ahora);
DateTimeToString(FV_Date2_S,'zzz',ahora);
FillChar(sEnviar,tamaño de(sEnviar),0);
FillChar(sHead,tamañode(sHead),0);
con enviar hacer
comenzar
strpcopy(SPNumber,'4488');//;
Número de cargo :='8613188890924';
Número de usuarios: = 1; archivo: //1-100
{para i:=1 a UserCount hacer
comenzar
file://strpcopy(UserNumber[i-1].TelN,'8613065073355');//+T_Tel);// :matriz de TelCount file://la longitud es UserCount;
Número de usuario[i-1].TelN:='8613011725853';
fin;}
Número de usuario:='8613188890924';
CorpID:='41027';//CorpID:='4488';//strpcopy(CorpID,FV_corpID);
ServiceType:='4488';//FV_SPNumber);//'4488';
Tipo de tarifa :=1;
Valor de tarifa :='0';
Valor dado :='0';
Bandera del agente :=0;
MOrelatetoMTFlag :=2;
Prioridad :=0;
Tiempo de caducidad :='';
Hora programada :='';
Bandera de informe :=1;
TP_pid :=0;
tp_udhi :=0;
Codificación del mensaje :=15;
Tipo de mensaje :=0;
Longitud del mensaje :=htonl(161);
strpcopy(MessageContent,T_msg); file://la longitud es MessageLength;
archivo://Reserva :='';
fin;
{línea1:=tamañode(sHead);
línea2:=tamañode(sEnviar);}
con la cabeza hacer
comenzar
abc:=htonl(FV_SNumber);
Longitud del mensaje:=htonl(sizeof(sHead)+sizeof(sSubmit)-3);
ID de comando:=htonl(SGIP_Submit);
Número1:=abc;
SNumber2:=htonl(StrToInt(FV_Date1_S));
SNumber3:=htonl(StrToInt(FV_Date2_S));
fin;
línea1:=flujo2.Write(cabeza,tamañode(cabeza));
línea2:=stream2.Write(sSubmit,sizeof(sSubmit)-3);
si stream2.WaitForData(5000) entonces
comenzar
fillchar(cHead,tamaño de(cHead),0);
fillchar(cSubmit_Resp,sizeof(cSubmit_Resp),0);
memo1.Lines.Add('leer enviar encabezado ............');
intentar
stream2.ReadBuffer(cHead,sizeof(cHead));
stream2.ReadBuffer(cSubmit_Resp,sizeof(cSubmit_Resp));
excepto
en e: excepción
memo1.Lines.Add(e.Mensaje);
fin;
memo1.Lines.Add('leer enviar csubmit_resp ............');
archivo://stream2.ReadBuffer(cBind_Resp,sizeof(cBind_resp));
fin;
flujo2.Gratis;
fin;
procedimiento TForm1.ClientSocket1Read(Remitente: TObject;
Zócalo: TCustomWinSocket);
var
comandoI,Tamaño del paquete:Palabra larga;
Recv1I,Recv2I:entero;
comenzar
FillChar(sHead,tamañode(sHead),0);
FillChar(sBind,tamaño de(sBind),0);
Recv1I:=socket.ReceiveBuf(sHead,sizeof(sHead));
comandoI:=ntohl(sHead.CommandId);
Tamaño del paquete:=ntohl(sHead.MessageLength);
si comandoI=SGIP_UNBIND_RESP entonces
comenzar
memo1.Lines.Add('------------------Se recibió la solicitud SGIP_UNBIND_RESP------------------');
salida;
fin;
Recv2I:=socket.ReceiveBuf(sBind,sizeof(sBind));
si comandoI=SGIP_BIND_RESP entonces
memo1.Lines.Add('---------------------SGIP_BIND_RESP------------------')
demás
si comandoI=SGIP_SUBMIT_RESP entonces
memo1.Lines.Add('---------------------SGIP_SUBMIT_RESP-------------')
demás
memo1.Lines.Add('---------------------'+inttostr(comandoI)+'------------- - ---');
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('Resultado '+inttostr(sBind_Resp.Result));
memo1.Lines.add('------------------end SGIP_UNBIND_RESP-------------------');
fin;
procedimiento TForm1.Button7Click(Remitente: TObject);
var
FV_Date1_S,FV_Date2_S: cadena;
flujo3:TWinSocketStream;
comenzar
Stream3:=TWinSocketStream.Create(clientSocket1.Socket,5000);
memo1.Lines.Add('-------------------Enviar solicitud UnBIND al servidor------------------ --');
si no es ClientSocket1.Active entonces
comenzar
memo1.Lines.Add('El cliente no está abierto');
flujo3.gratis;
salida;
fin;
DateTimeToString(FV_Date1_S,'mmddhhnnss',ahora);
DateTimeToString(FV_Date2_S,'zzz',ahora);
FillChar(sHead,tamañode(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));
flujo3.Write(sHead,20);
FillChar(sHead,20,0);
si stream3.WaitForData(5000) entonces
comenzar
stream3.ReadBuffer(sHead,20);
fin;
flujo3.Gratis;
fin;
procedimiento TForm1.ServerSocket1ClientRead(Remitente: TObject;
Zócalo: TCustomWinSocket);
var
RecvSize1,RecvSize2,DeSize:entero;
comandoI,Tamaño del mensaje:Palabra larga;
comenzar
TamañoRecv1:=0;
TamañoRecv2:=0;
FillChar(cHead,TamañoDe(cHead),0);
RecvSize1:=socket.ReceiveBuf(cHead,SizeOf(cHead));
comandoI:=ntohl(cHead.CommandId);
Tamaño del mensaje:=ntohl(cHead.MessageLength);
si comandoI=SGIP_BIND entonces
comenzar
memo1.Lines.Add('************************Solicitud de vinculación recibida****************** ** ***');
FillChar(cBind,TamañoDe(cBind),0);
FillChar(cBind_Resp,SizeOf(cBind_Resp),0);
RecvSize2:=Socket.ReceiveBuf(cBind,MessageSize-RecvSize1);
si (RecvSize2+RecvSize1)<>MessageSize entonces
comenzar
memo1.Lines.Add('************************error de recepción de datos de enlace****************** ***** **');
salida;
fin;
TamañoRecv2:=0;TamañoRecv1:=0;
cHead.CommandId:=htonl(SGIP_BIND_RESP);
cHead.MessageLength:=htonl(sizeof(cHead)+sizeof(cBind_Resp));
cBind_Resp.Resultado:=0;
RecvSize1:=Socket.SendBuf(cHead,SizeOf(cHead));
RecvSize2:=Socket.SendBuf(cBind_Resp,SizeOf(cBind_Resp));
si (RecvSize1+RecvSize2)<>ntohl(cHead.MessageLength) entonces
comenzar
memo1.Lines.Add('************************Error en respuesta a la solicitud de vinculación************* ********* ******');
salida;
fin;
fin
demás
si comandoI=SGIP_DELIVER entonces
comenzar
memo1.Lines.Add('************************Se recibió la solicitud SGIP_DELIVER****************** ******** *');
DeSize:=SizeOf(cDeliver);
FillChar(cEntregar,TamañoDe(cEntregar),0);
FillChar(cDeliver_Resp,SizeOf(cDeliver_Resp),0);
RecvSize2:=Socket.ReceiveBuf(cDeliver,MessageSize-RecvSize1);
si (RecvSize2+RecvSize1)<>MessageSize entonces
comenzar
memo1.Lines.Add('************************Error de recepción de datos SGIP_DELIVER*************** ******* **');
salida;
fin;
TamañoRecv2:=0;TamañoRecv1:=0;
cHead.CommandId:=htonl(SGIP_DELIVER_RESP);
cHead.MessageLength:=htonl(sizeof(cHead)+sizeof(cDeliver_Resp));
cDeliver_Resp.Resultado:=0;
RecvSize1:=Socket.SendBuf(cHead,SizeOf(cHead));
RecvSize2:=Socket.SendBuf(cDeliver_Resp,SizeOf(cDeliver_Resp));
si (RecvSize1+RecvSize2)<>ntohl(cHead.MessageLength) entonces
comenzar
memo1.Lines.Add('************************Respuesta al error de solicitud SGIP_DELIVER************** ********** ******');
salida;
fin;
fin
demás
si comandoI=SGIP_UNBIND entonces
comenzar
cHead.CommandId:=htonl(SGIP_UNBIND_RESP);
cHead.MessageLength:=htonl(sizeof(cHead));
memo1.Lines.Add('Respuesta a SGIP_UNBIND******************************');
RecvSize2:=Socket.SendBuf(cHead,sizeOf(cHead));
si RecvSize2<>ntohl(cHead.MessageLength) entonces
comenzar
memo1.Lines.Add('************************Error de envío SGIP_UNBIND****************** ******');
salida;
fin;
fin
demás
comenzar
fin;
fin;
fin.
//................................................ ................ ............
archivo://protocolo
unidad xy;
interfaz
usos
SysUtils;
constante
SGIP_BIND =$1; archivo://Verificar cliente
SGIP_BIND_RESP=$80000001; file://server devuelve la solicitud de verificación
SGIP_UNBIND =$2; archivo://desconectar
SGIP_UNBIND_RESP =$80000002; file://Volver al estado desconectado
SGIP_SUBMIT =$3; file://Enviar mensaje corto MT a SMG
SGIP_SUBMIT_RESP =$80000003; file://Devolver el estado del mensaje corto MT de envío del SP
SGIP_DELIVER =$4; file://SMG envía un mensaje corto de MO al SP
SGIP_DELIVER_RESP =$80000004; file://volver al estado SMG
SGIP_REPORT =$5; file://Envía el estado actual de un comando de envío anterior al SP
SGIP_REPORT_RESP=$80000005; archivo://Estado de respuesta SMG
file://Los siguientes protocolos son inútiles para 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; //
tipo
TEMPTY=Archivo de registro://registro vacío
fin;
archivo://encabezado del mensaje
SGIPHead=Registro
MessageLength:longword; file://La longitud total del mensaje (bytes)
ID de comando: palabra larga; archivo://ID de comando
SNumber1, SNumber2, SNumber3: archivo de palabra larga: // número de serie
fin;
archivo://cuerpo del mensaje
XBind=Grabar //
Tipo de entrada larga: byte;
LonginPass: matriz [0..15] de carácter;
LonginName: matriz [0..15] de carácter;
Reserva :matriz[0..7] de char;
fin;
Bind_Resp=Grabar
Resultado :byte;
Reserva :matriz[0..7] de char;
fin;
//
Desvincular=TEMPTY;
Unbind_Resp=TEMPTY;
//
TelCount=archivo de registro://número de teléfono móvil
TelN: matriz [0..20] de carácter;
fin;
XSubmit=Registrar
Número SPN: matriz [0..20] de carácter;
Número de carga: matriz [0..20] de carácter;
Número de usuarios: byte; archivo: //1-100
Número de usuario: matriz [0..20] de char; // TelCount file://la longitud es UserCount;
CorpID: matriz [0..4] de carácter;
Tipo de servicio: matriz [0..9] de carácter;
Tipo de tarifa: byte;
FeeValue: matriz [0..5] de carácter;
Valor dado: matriz [0..5] de carácter;
BanderaAgente :byte;
MOrelatetoMTFlag :byte;
Prioridad:byte;
ExpireTime: matriz [0..15] de carácter;
ScheduleTime: matriz [0..15] de carácter;
Bandera de informe: byte;
TP_pid:byte;
TP_udhi:byte;
Codificación de mensaje:byte;
Tipo de mensaje:byte;
Longitud del mensaje: palabra larga;
Contenido del mensaje: matriz [0..160] de carácter; archivo://la longitud es Longitud del mensaje;
Reserva :matriz[0..7] de char;
fin;
Submit_Resp=Registro
Resultado :byte;
Reserva :matriz[0..7] de char;
fin;
//
XEntregar=Grabar
Número de usuario: matriz [0..20] de carácter;
Número SPN: matriz [0..27] de carácter;
{TP_pid: byte;
TP_udhi:byte;
Codificación de mensaje:byte;
Longitud del mensaje: palabra larga;}
Contenido del mensaje: matriz [0..254] de carácter; archivo://la longitud es Longitud del mensaje;
Reservador: matriz [0..7] de char;
fin;
Deliver_Resp=Grabar
Resultado :byte;
Reserva :matriz[0..7] de char;
fin;
//
XReport=Registro
SubSequNumber1, SubSequNumber2, SubSequNumber3: palabra larga;
Tipo de informe: byte;
Número de usuario: matriz [0..20] de carácter;
Estado :byte;
Código de error:byte;
Reserva :matriz[0..7] de char;
fin;
Report_Resp=Registro
Resultado :byte;
Reserva :matriz[0..7] de char;
fin;
implementación
fin.
archivo://,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//
Servidor
unidad principal;
interfaz
usos
Windows, Mensajes, SysUtils, Variantes, Clases, Gráficos, Controles, Formularios,
Diálogos, xy, ScktComp, StdCtrls, winsock;
tipo
TForm1 = clase(TForm)
Memo1: TMemo;
ServerSocket1: TServerSocket;
procedimiento ServerSocket1ClientRead(Remitente: TObject;
Zócalo: TCustomWinSocket);
procedimiento ServerSocket1ClientError(Remitente: TObject;
Conector: TCustomWinSocket; ErrorEvent: TErrorEvent;
varErrorCode: Entero);
privado
{Declaraciones privadas}
público
{Declaraciones públicas}
fin;
var
Formulario1: TForm1;
implementación
{$R*.dfm}
procedimiento TForm1.ServerSocket1ClientRead(Remitente: TObject;
Zócalo: TCustomWinSocket);
tipo
SendPack = registro empaquetado
jefe: SGIHead;
resp: Bind_Resp;
fin;
var
Reencabezar: SGIPHead;
sresp:Bind_Resp;
Reenlazar:xEnlazar;
ReEntregar:XEntregar;
InformeReporte:XReporte;
i1,i2:entero;
cadena:cadena;
S_Number1,S_Number2,S_Number3,longI1:palabra larga;
s_Pack:EnviarPaquete;
comenzar
fillchar(sresp,tamañode(sresp),0);
fillchar(ReHead,tamañode(ReHead),0);
i1:=Socket.ReceiveBuf(ReHead,sizeof(ReHead));
si i1<>sizeof(ReHead) entonces
comenzar
memo1.Lines.Add('Salida de error del mensaje recibido');
salida;
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('leer mensaje 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 entonces
comenzar archivo://desconectar
FillChar(ReHead,TamañoDe(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) entonces
memo1.Lines.Add('Enviar error SGIP_UNBIND_Resp')
demás
memo1.Lines.Add('Enviar SGIP_UNBIND_Resp OK');
fin
de lo contrario, si ReHead.CommandId=SGIP_BIND entonces
comenzar archivo://SMG envía un mensaje corto MO al SP
FillChar(s_Pack,TamañoDe(s_Pack),0);
FillChar(ReBind,TamañoDe(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.Resultado:=0;
i1:=socket.SendBuf(s_Pack,SizeOf(s_Pack));
si i1<>SizeOf(s_Pack) entonces
memo1.Lines.Add('enviar error SGIP_Bind_Resp')
demás
memo1.Lines.Add('Enviar SGIP_bind_Resp');
fin
de lo contrario, si ReHead.CommandId=SGIP_DELIVER entonces
comenzar
FillChar(s_Pack,TamañoDe(s_Pack),0);
FillChar(Volver a entregar,SizeOf(Volver a entregar),0);
Socket.ReceiveBuf(ReEntregar,SizeOf(ReEntregar));
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.Resultado:=0;
si socket.SendBuf(s_Pack,SizeOf(s_Pack)) <>SizeOf(s_Pack) entonces
memo1.Lines.Add('enviar error SGIP_DELIVER_RESP')
demás
memo1.Lines.Add('Enviar SGIP_DELIVER_RESP OK');
memo1.Lines.Add(ReDeliver.UserNumber);
memo1.Lines.Add(ReDeliver.SPNumber);
archivo://longI1:=ntohl(ReDeliver.MessageLength);
file://memo1.Lines.Add(inttostr(longI1)+' '+inttostr(ReDeliver.MessageLength));
memo1.Lines.Add(ReDeliver.MessageContent);
fin
de lo contrario, si ReHead.CommandId=SGIP_REPORT entonces
comenzar
FillChar(s_Pack,TamañoDe(s_Pack),0);
FillChar(Informe,TamañoDe(Informe),0);
Socket.ReceiveBuf(Informe,TamañoDe(Informe));
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.Resultado:=0;
si socket.SendBuf(s_Pack,SizeOf(s_Pack)) <>SizeOf(s_Pack) entonces
memo1.Lines.Add('enviar error SGIP_Bind_Resp')
demás
memo1.Lines.Add('Enviar SGIP_bind_Resp');
memo1.Lines.Add(ReReport.UserNumber);
memo1.Lines.Add(inttostr(ReReport.State));
fin;
fin;
procedimiento TForm1.ServerSocket1ClientError(Remitente: TObject;
Conector: TCustomWinSocket; ErrorEvent: TErrorEvent;
varErrorCode: Entero);
var
mensaje de error:cadena;
comenzar
caso ErrorEvento de
eeGeneral: errorMsg:='eeGeneral';
eeSend: errorMsg:='eeSend';
eeReceive: errorMsg:='eeReceive';
eeConnect: errorMsg:='eeConnect';
eeDisconnect: errorMsg:='eeDisconnect';
eeAccept: errorMsg:='eeAccept';
fin;
Código de error:=0;
Memo1.Lines.Add('Error de socket:'+errorMsg);
fin;
fin.