После долгих поисков в Интернете я не смог найти ни одного примера SGip, мне было грустно, и я наконец сделал пример SGIP для Delphi6.0.
Содержит сервер и клиент, протокол общий, сервер представляет собой неблокируемое длинное соединение, а клиент — блокирующее короткое соединение.
Программа очень запутанная, а стиль очень плохой. Надеюсь, эксперты дадут мне несколько советов.
([email protected],[email protected])
файл://клиент
модуль TestMain;
интерфейс
использует
Windows, сообщения, SysUtils, варианты, классы, графика, элементы управления, формы,
Диалоги, ScktComp, StdCtrls, ExtCtrls, xy, winsock;
константа
FV_SNumber=3053112345;
FV_LoginPass = 'привет';
FV_LoginName='привет';
FV_SPNumber = '12345';
T_Tel='13000000000';
FV_corpID='12345';
T_msg='Я написал твое имя на небе, и его не унес ветер';
тип
ТФорм1 = класс (ТФорма)
Памятка1: TMemo;
Кнопка1: Кнопка T;
КлиентСокет1: ТКлиентСокет;
Кнопка3: Кнопка T;
Кнопка4: Кнопка T;
Кнопка2: Кнопка T;
Кнопка5: Кнопка T;
Кнопка6: Кнопка T;
Кнопка7: Кнопка T;
СерверСокет1: ТСерверСокет;
панель1: ТПанель;
PROcedure Button2Click (Отправитель: TObject);
процедура Button1Click (Отправитель: TObject);
процедура Button6Click (Отправитель: TObject);
процедура Button5Click (Отправитель: TObject);
процедура Button3Click (Отправитель: TObject);
процедура Button4Click (Отправитель: TObject);
процедура ClientSocket1Read (Отправитель: TObject; Сокет: TCustomWinSocket);
процедура Button7Click (Отправитель: TObject);
процедура ServerSocket1ClientRead (Отправитель: TObject;
Сокет: TCustomWinSocket);
частный
{Частные заявления}
общественный
{Публичные заявления}
file://определение клиентского протокола
sHead: SGIHead; file://Определение заголовка сообщения
sBind: XBind; файл://Проверка запроса на соединение;
sBind_Resp: Bind_Resp; file://Ответ на проверку запроса на подключение
sSubmit: XSubmit; file://SP->SMG отправить SMS
sSubmit_Resp: Submit_Resp; file://SMG отвечает на статус SMS, отправленный SP
sDeliver: XDeliver; файл://SMG->SP отправить SMS
sDeliver_Resp: Deliver_Resp file://SP отвечает на статус SMS, отправленный SMG
sReport: XReport file://SMG->SP предыдущий статус SMS
sReport_Resp: Report_Resp; file://Состояние выполнения команды ответа
файл://определение протокола сервера
cHead: SGIHead; file://Определение заголовка сообщения
cBind: XBind; файл://Проверка запроса на подключение
cBind_Resp: Bind_Resp file://Ответ на проверку запроса на соединение
cSubmit: XSubmit; file://SP->SMG отправить SMS
cSubmit_Resp: Submit_Resp; file://SMG отвечает на статус SMS, отправленный поставщиком услуг.
cDeliver: XDeliver; файл://SMG->SP отправить SMS
cDeliver_Resp: Deliver_Resp; file://SP отвечает на статус SMS, отправленный SMG.
cReport: XReport file://SMG->SP предыдущий статус SMS
cReport_Resp: Report_Resp; file://Состояние выполнения команды ответа
конец;
вар
Форма1: ТФорм1;
выполнение
{$R *.dfm}
процедура TForm1.Button2Click(Отправитель: TObject);
начинать
ClientSocket1.Active:=false;
если ClientSocket1.Active, то
memo1.Lines.Add('Не удалось завершить работу клиента')
еще
memo1.Lines.Add('Клиент успешно закрыт');
конец;
процедура TForm1.Button1Click(Отправитель: TObject);
начинать
ClientSocket1.Active:=true;
если ClientSocket1.Active, то
memo1.Lines.Add('Клиент открыт успешно')
еще
memo1.Lines.Add('Ошибка открытия клиента');
конец;
процедура TForm1.Button6Click(Отправитель: TObject);
начинать
ServerSocket1.Active:=true;
если ServerSocket1.Active, то
memo1.Lines.Add('Сервер успешно открыт')
еще
memo1.Lines.Add('Ошибка открытия сервера');
конец;
процедура TForm1.Button5Click(Отправитель: TObject);
начинать
ServerSocket1.Active:=false;
если ServerSocket1.Active, то
memo1.Lines.Add('Не удалось завершить работу сервера')
еще
memo1.Lines.Add('Сервер успешно закрыт');
конец;
процедура TForm1.Button3Click(Отправитель: TObject);
вар
FV_Date1_S,FV_Date2_S: строка;
str_i, SendSize: целое число;
поток1: TWinSocketStream;
АБВ, BC: ЛонгВорд;
начинать
поток1:=TWinSocketStream.Create(ClientSocket1.Socket,30000);
memo1.Lines.Add('-------------------Отправить запрос BIND на сервер------------------ --');
если не ClientSocket1.Active, то
начинать
memo1.Lines.Add('Клиент не открыт');
Выход;
конец;
DateTimeToString(FV_Date1_S,'mmddhhnnss',сейчас);
DateTimeToString(FV_Date2_S,'zzz',сейчас);
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));
поток1.WriteBuffer(sHead,sizeof(sHead));
поток1.WriteBuffer(sBind,sizeof(sBind));
memo1.Lines.Add('sHead.MessageLength '+inttostr(ntohl(sHead.MessageLength)));
memo1.Lines.Add('sHead.CommandId '+inttostr(ntohl(sHead.CommandId)));
до н.э.:=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('------------------Запрос на привязку отправлен -------------------- ------ -');
если поток1.WaitForData(5000), то
начинать
fillchar (cHead, sizeof (cHead), 0);
fillchar (cbind_resp, sizeof (cBind_Resp), 0);
поток1.ReadBuffer(cHead,sizeof(cHead));
поток1.ReadBuffer(cBind_resp,sizeof(cBind_resp));
конец;
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));
поток1.Бесплатно;
конец;
процедура TForm1.Button4Click(Отправитель: TObject);
файл://тип
{abc=упакованная запись
руководитель: SGIHead;
отправить: xSubmit;
конец;}
вар
FV_Date1_S,FV_Date2_S: строка;
я, SendSize: целое число;
файл://xxx:abc;
поток2: твинсокетстрим;
abc, bc: длинное слово;
строка1, строка2: длинное слово;
начинать
поток2:=twinsocketstream.Create(clientsocket1.Socket,5000);
ОтправитьРазмер:=0;
memo1.Lines.Add('-------------------------отправить----------------- ---------');
если не ClientSocket1.Active, то
начинать
memo1.Lines.Add('------------------Клиент не открыт, не удалось отправить -------------');
Выход;
конец;
DateTimeToString(FV_Date1_S,'mmddhhnnss',сейчас);
DateTimeToString(FV_Date2_S,'zzz',сейчас);
FillChar (sSubmit, sizeof (sSubmit), 0);
FillChar(sHead,sizeof(sHead),0);
с помощью ssubmit сделать
начинать
strpcopy(SPNumber,'4488');//;
ChargeNumber :='8613188890924';
UserCount :=1; файл://1-100;
{for i:=1 для UserCount do
начинать
file://strpcopy(UserNumber[i-1].TelN,'8613065073355');//+T_Tel);// :массив TelCount; file://length — UserCount;
UserNumber[i-1].TelN:='8613011725853';
конец;}
Номер пользователя:='8613188890924';
CorpID:='41027';//CorpID:='4488';//strpcopy(CorpID,FV_corpID);
ServiceType:='4488';//FV_SPNumber);//'4488';
Тип комиссии :=1;
FeeValue :='0';
УчитываяЗначение:='0';
АгентФлаг :=0;
MOrelatetoMTFlag :=2;
Приоритет:=0;
Время истечения срока действия :='';
ScheduleTime :='';
ФлагОтчета :=1;
ТП_pid:=0;
tp_udhi: = 0;
Кодирование сообщения:=15;
Тип сообщения:=0;
Длина сообщения:=htonl(161);
strpcopy(MessageContent,T_msg); file://длина — MessageLength;
файл://Резерв :='';
конец;
{line1:=sizeof(sHead);
строка2:=sizeof(sSubmit);}
с sHead сделать
начинать
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));
конец;
line1:=stream2.Write(shead,sizeof(shead));
line2:=stream2.Write(sSubmit,sizeof(sSubmit)-3);
если поток2.WaitForData(5000), то
начинать
fillchar (cHead, sizeof (cHead), 0);
fillchar (cSubmit_Resp, sizeof (cSubmit_Resp), 0);
memo1.Lines.Add('прочитать заголовок отправки ...........');
пытаться
поток2.ReadBuffer(cHead,sizeof(cHead));
поток2.ReadBuffer(cSubmit_Resp,sizeof(cSubmit_Resp));
кроме
на e:исключение сделать
memo1.Lines.Add(e.Message);
конец;
memo1.Lines.Add('прочитать submit csubmit_resp ............');
файл://stream2.ReadBuffer(cBind_Resp,sizeof(cBind_resp));
конец;
поток2.Бесплатно;
конец;
процедура TForm1.ClientSocket1Read(Отправитель: TObject;
Сокет: TCustomWinSocket);
вар
CommandI, PackSize: длинное слово;
Recv1I, Recv2I: целое число;
начинать
FillChar(sHead,sizeof(sHead),0);
FillChar (sBind, sizeof (sBind), 0);
Recv1I:=socket.ReceiveBuf(sHead,sizeof(sHead));
CommandI:=ntohl(sHead.CommandId);
PackSize:=ntohl(sHead.MessageLength);
если командаI=SGIP_UNBIND_RESP, то
начинать
memo1.Lines.Add('------------------Получен запрос SGIP_UNBIND_RESP------------------');
Выход;
конец;
Recv2I:=socket.ReceiveBuf(sBind,sizeof(sBind));
если командаI=SGIP_BIND_RESP, то
memo1.Lines.Add('---------------------SGIP_BIND_RESP------------------')
еще
если командаI=SGIP_SUBMIT_RESP, то
memo1.Lines.Add('---------------------SGIP_SUBMIT_RESP-------------')
еще
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('Результат '+inttostr(sBind_Resp.Result));
memo1.Lines.add('------------------end SGIP_UNBIND_RESP-------------------');
конец;
процедура TForm1.Button7Click(Отправитель: TObject);
вар
FV_Date1_S,FV_Date2_S: строка;
поток3: TWinSocketStream;
начинать
Stream3:=TWinSocketStream.Create(clientSocket1.Socket,5000);
memo1.Lines.Add('-------------------Отправить запрос UnBIND на сервер------------------ --');
если не ClientSocket1.Active, то
начинать
memo1.Lines.Add('Клиент не открыт');
поток3.бесплатно;
Выход;
конец;
DateTimeToString(FV_Date1_S,'mmddhhnnss',сейчас);
DateTimeToString(FV_Date2_S,'zzz',сейчас);
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));
поток3.Write(sHead,20);
FillChar(sHead,20,0);
если поток3.WaitForData(5000), то
начинать
поток3.ReadBuffer(sHead,20);
конец;
поток3.Бесплатно;
конец;
процедура TForm1.ServerSocket1ClientRead(Отправитель: TObject;
Сокет: TCustomWinSocket);
вар
RecvSize1, RecvSize2, DeSize: целое число;
CommandI,MessageSize:LongWord;
начинать
РеквСизе1:=0;
РеквСизе2:=0;
FillChar(cHead,SizeOf(cHead),0);
RecvSize1:=socket.ReceiveBuf(cHead,SizeOf(cHead));
CommandI:=ntohl(cHead.CommandId);
MessageSize:=ntohl(cHead.MessageLength);
если командаI=SGIP_BIND, то
начинать
memo1.Lines.Add('************************Получен запрос на привязку****************** ** ***');
FillChar(cBind,SizeOf(cBind),0);
FillChar(cBind_Resp,SizeOf(cBind_Resp),0);
RecvSize2:=Socket.ReceiveBuf(cBind,MessageSize-RecvSize1);
если (RecvSize2+RecvSize1)<>MessageSize, то
начинать
memo1.Lines.Add('************************ошибка получения данных привязки****************** ***** **');
Выход;
конец;
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));
если (RecvSize1+RecvSize2)<>ntohl(cHead.MessageLength), то
начинать
memo1.Lines.Add('************************Ошибка в ответ на запрос привязки*************** ********* ******');
Выход;
конец;
конец
еще
если командаI=SGIP_DELIVER, то
начинать
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);
если (RecvSize2+RecvSize1)<>MessageSize, то
начинать
memo1.Lines.Add('************************Ошибка приема данных SGIP_DELIVER*************** ******* **');
Выход;
конец;
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));
если (RecvSize1+RecvSize2)<>ntohl(cHead.MessageLength), то
начинать
memo1.Lines.Add('************************Ответ на ошибку запроса SGIP_DELIVER************** ********** ******');
Выход;
конец;
конец
еще
если командаI=SGIP_UNBIND, то
начинать
cHead.CommandId:=htonl(SGIP_UNBIND_RESP);
cHead.MessageLength:=htonl(sizeof(cHead));
memo1.Lines.Add('Ответ на SGIP_UNBIND******************************');
RecvSize2:=Socket.SendBuf(cHead,sizeOf(cHead));
если RecvSize2<>ntohl(cHead.MessageLength), то
начинать
memo1.Lines.Add('************************Ошибка отправки SGIP_UNBIND****************** ******');
Выход;
конец;
конец
еще
начинать
конец;
конец;
конец.
//................................................. .......... ............
файл://протокол
единица ху;
интерфейс
использует
СисУтилс;
константа
SGIP_BIND =$1; файл://Проверить клиент
SGIP_BIND_RESP=$80000001; file://сервер возвращает запрос на проверку
SGIP_UNBIND = $2 файл://отключиться;
SGIP_UNBIND_RESP =$80000002 file://Возврат в отключенное состояние;
SGIP_SUBMIT =$3; file://Отправить короткое сообщение MT в SMG
SGIP_SUBMIT_RESP =$80000003;file://Вернуть статус короткого сообщения MT отправки SP
SGIP_DELIVER =$4; file://SMG отправляет короткое сообщение MO SP.
SGIP_DELIVER_RESP = $80000004 файл://возврат к статусу SMG;
SGIP_REPORT =$5; file://Отправляет SP текущий статус предыдущей команды отправки.
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=$а //
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=$е //
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 //
тип
TEMPTY=Файл записи://пустая запись
конец;
файл://заголовок сообщения
SGIHead=Запись
MessageLength:longword; file://Общая длина сообщения (в байтах)
Идентификатор команды: длинное слово; файл://ИД_команды;
SNumber1,SNumber2,SNumber3:длинное слово файл://серийный номер;
конец;
файл://тело сообщения
XBind=Запись //
ЛонгинТип :байт;
LonginPass: массив [0..15] символов;
LonginName: массив [0..15] символов;
Резерв: массив [0..7] символов;
конец;
Bind_Resp=Запись
Результат: байт;
Резерв: массив [0..7] символов;
конец;
//
Отменить привязку = TEMPTY;
Unbind_Resp=TEMPTY;
//
TelCount=файл записи://номер мобильного телефона
TelN: массив [0..20] символов;
конец;
XSubmit=Запись
SPNumber: массив [0..20] символов;
ChargeNumber: массив [0..20] символов;
UserCount :байт;файл://1-100
UserNumber :массив[0..20] символов;//TelCount file://длина — UserCount;
CorpID: массив[0..4] символов;
ServiceType: массив [0..9] символов;
Тип комиссии :байт;
FeeValue: массив [0..5] символов;
GiveValue: массив [0..5] символов;
АгентФлаг :байт;
MOrelatetoMTFlag :byte;
Приоритет: байт;
ExpireTime: массив [0..15] символов;
ScheduleTime: массив [0..15] символов;
Флаг отчета :байт;
TP_pid: байт;
TP_udhi:байт;
Кодирование сообщения: байт;
Тип сообщения: байт;
Длина сообщения: длинное слово;
MessageContent: массив [0..160] символов; file://length — длина сообщения;
Резерв: массив [0..7] символов;
конец;
Submit_Resp=Запись
Результат: байт;
Резерв: массив [0..7] символов;
конец;
//
XDeliver=Запись
UserNumber: массив [0..20] символов;
SPNumber: массив [0..27] символов;
{TP_pid: байт;
TP_udhi:байт;
Кодирование сообщения: байт;
Длина сообщения :длинное слово;}
MessageContent: массив [0..254] символов; file://длина — MessageLength;
Резерватор: массив [0..7] символов;
конец;
Deliver_Resp=Запись
Результат: байт;
Резерв: массив [0..7] символов;
конец;
//
XReport=Запись
SubSequNumber1, SubSequNumber2, SubSequNumber3: длинное слово;
Тип отчета :байт;
UserNumber: массив [0..20] символов;
Состояние: байт;
Код ошибки: байт;
Резерв: массив [0..7] символов;
конец;
Report_Resp=Запись
Результат: байт;
Резерв: массив [0..7] символов;
конец;
выполнение
конец.
файл://,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//
Сервер
основной блок;
интерфейс
использует
Windows, сообщения, SysUtils, варианты, классы, графика, элементы управления, формы,
Диалоги, xy, ScktComp, StdCtrls, winsock;
тип
ТФорм1 = класс (ТФорма)
Памятка1: TMemo;
СерверСокет1: ТСерверСокет;
процедура ServerSocket1ClientRead (Отправитель: TObject;
Сокет: TCustomWinSocket);
процедура ServerSocket1ClientError (Отправитель: TObject;
Сокет: TCustomWinSocket;ErrorEvent: TErrorEvent;
varErrorCode: Целое число);
частный
{Частные заявления}
общественный
{Публичные заявления}
конец;
вар
Форма1: ТФорм1;
выполнение
{$R *.dfm}
процедура TForm1.ServerSocket1ClientRead(Отправитель: TObject;
Сокет: TCustomWinSocket);
тип
SendPack = упакованная запись
руководитель: SGIHead;
соответственно: Bind_Resp;
конец;
вар
ReHead:SGIHead;
сресп: Bind_Resp;
Повторная привязка: xBind;
РеДоставка: XDeliver;
Ререпорт: XReport;
я1, я2: целое число;
ул: строка;
S_Number1,S_Number2,S_Number3,longI1:длинное слово;
s_Pack: SendPack;
начинать
fillchar(sresp,sizeof(sresp),0);
fillchar(ReHead,sizeof(ReHead),0);
i1:=Socket.ReceiveBuf(ReHead,sizeof(ReHead));
если i1<>sizeof(ReHead), то
начинать
memo1.Lines.Add('Ошибка получения сообщения, выход');
Выход;
конец;
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');
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));
если ReHead.CommandId=SGIP_UNBIND, то
начать файл://отключить
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));
если i1<>sizeof(ReHead), то
memo1.Lines.Add('Ошибка отправки SGIP_UNBIND_Resp')
еще
memo1.Lines.Add('Отправить SGIP_UNBIND_Resp OK');
конец
иначе, если ReHead.CommandId=SGIP_BIND, тогда
начало файла://SMG отправляет короткое сообщение MO SP
FillChar(s_Pack,SizeOf(s_Pack),0);
FillChar(ReBind,SizeOf(ReBind),0);
сокет.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));
если i1<>SizeOf(s_Pack), то
memo1.Lines.Add('отправить ошибку SGIP_Bind_Resp')
еще
memo1.Lines.Add('Отправить SGIP_bind_Resp');
конец
иначе, если ReHead.CommandId=SGIP_DELIVER, тогда
начинать
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;
если сокет.SendBuf(s_Pack,SizeOf(s_Pack)) <>SizeOf(s_Pack) тогда
memo1.Lines.Add('ошибка отправки SGIP_DELIVER_RESP')
еще
memo1.Lines.Add('Отправить SGIP_DELIVER_RESP OK');
memo1.Lines.Add(ReDeliver.UserNumber);
memo1.Lines.Add(ReDeliver.SPNumber);
файл://longI1:=ntohl(ReDeliver.MessageLength);
file://memo1.Lines.Add(inttostr(longI1)+' '+inttostr(ReDeliver.MessageLength));
memo1.Lines.Add(ReDeliver.MessageContent);
конец
иначе, если ReHead.CommandId=SGIP_REPORT, тогда
начинать
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;
если сокет.SendBuf(s_Pack,SizeOf(s_Pack)) <>SizeOf(s_Pack) тогда
memo1.Lines.Add('отправить ошибку SGIP_Bind_Resp')
еще
memo1.Lines.Add('Отправить SGIP_bind_Resp');
memo1.Lines.Add(ReReport.UserNumber);
memo1.Lines.Add(inttostr(ReReport.State));
конец;
конец;
процедура TForm1.ServerSocket1ClientError(Отправитель: TObject;
Сокет: TCustomWinSocket;ErrorEvent: TErrorEvent;
varErrorCode: Целое число);
вар
errorMsg: строка;
начинать
случай ErrorEvent из
eeGeneral: errorMsg:='eeGeneral';
eeSend: errorMsg:='eeSend';
eeReceive: errorMsg:='eeReceive';
eeConnect: errorMsg:='eeConnect';
eeDisconnect: errorMsg:='eeDisconnect';
eeAccept: errorMsg:='eeAccept';
конец;
КодОшибки:=0;
Memo1.Lines.Add('Ошибка сокета:'+errorMsg);
конец;
конец.