بعد البحث لفترة طويلة على الإنترنت، لم أتمكن من العثور على أي مثال SGip، شعرت بالحزن وأخيرًا قمت بإنشاء مثال SGIP لـ Delphi6.0.
يحتوي على خادم وعميل، والبروتوكول مشترك، والخادم عبارة عن اتصال طويل غير محظور، والعميل عبارة عن اتصال قصير محظور.
البرنامج فوضوي للغاية والأسلوب سيء للغاية وآمل أن يقدم لي الخبراء بعض النصائح.
([email protected]،[email protected])
الملف: // العميل
وحدة الاختبار الرئيسية؛
واجهة
الاستخدامات
Windows، الرسائل، SysUtils، المتغيرات، الفئات، الرسومات، عناصر التحكم، النماذج،
مربعات الحوار، ScktComp، StdCtrls، ExtCtrls، xy، Winsock؛
ثابت
FV_SNumber=3053112345;
FV_LoginPass='hi';
FV_LoginName='hi';
FV_SPNumber='12345';
T_Tel='13000000000';
FV_corpID='12345';
T_msg='كتبت اسمك في السماء ولم تأخذه الريح';
يكتب
TForm1 = الفئة (TForm)
مذكرة 1: مذكرة؛
Button1: TButton؛
ClientSocket1: TClientSocket;
Button3: TButton؛
Button4: TButton؛
Button2: TButton؛
Button5: زر؛
Button6: TButton؛
Button7: زر؛
ServerSocket1: TServerSocket؛
اللوحة 1: لوحة T؛
الإجراء Button2Click(Sender: TObject);
الإجراء Button1Click(Sender: TObject);
الإجراء Button6Click(Sender: TObject);
الإجراء Button5Click(Sender: TObject);
الإجراء Button3Click(Sender: TObject);
الإجراء Button4Click(Sender: TObject);
الإجراء ClientSocket1Read(Sender: TObject; المقبس: TCustomWinSocket);
الإجراء Button7Click(Sender: TObject);
الإجراء ServerSocket1ClientRead(Sender: TObject;
المقبس: TCustomWinSocket)؛
خاص
{تصريحات خاصة}
عام
{التصريحات العامة}
الملف: // تعريف بروتوكول العميل
sHead: ملف SGIHead: // تعريف رأس الرسالة
sBind: XBind؛ ملف: // التحقق من طلب الاتصال
sBind_Resp: ملف Bind_Resp://الاستجابة للتحقق من طلب الاتصال
sSubmit: ملف XSubmit://SP->SMG إرسال الرسائل القصيرة
sSubmit_Resp: Submit_Resp file://SMG يستجيب لحالة الرسائل القصيرة المرسلة من SP
sDeliver: XDeliver؛ الملف://SMG->SP إرسال الرسائل القصيرة
sDeliver_Resp: ملف Delivery_Resp://SP يستجيب لحالة الرسائل القصيرة المرسلة من SMG
sReport: ملف XReport://SMG->SP حالة الرسائل القصيرة السابقة
sReport_Resp: ملف Report_Resp://حالة تنفيذ أمر الاستجابة
الملف: // تعريف بروتوكول الخادم
cHead: ملف SGIHead: // تعريف رأس الرسالة
cBind: XBind؛ ملف: // التحقق من طلب الاتصال
cBind_Resp: Bind_Resp; file://الاستجابة للتحقق من طلب الاتصال
cSubmit: ملف XSubmit://SP->SMG إرسال الرسائل القصيرة
cSubmit_Resp: Submit_Resp file://SMG يستجيب لحالة الرسائل القصيرة المرسلة من مقدم الخدمة
cDeliver: XDeliver; file://SMG->SP إرسال الرسائل القصيرة
cDeliver_Resp: ملف Delivery_Resp://SP يستجيب لحالة الرسائل القصيرة المرسلة من SMG
cReport: ملف XReport://SMG->SP حالة الرسائل القصيرة السابقة
cReport_Resp: ملف Report_Resp://حالة تنفيذ أمر الاستجابة
نهاية؛
فار
Form1: TForm1؛
تطبيق
{$R *.dfm}
الإجراء TForm1.Button2Click(Sender: TObject);
يبدأ
ClientSocket1.Active:=false;
إذا ClientSocket1.Active بعد ذلك
memo1.Lines.Add("فشل إيقاف تشغيل العميل")
آخر
memo1.Lines.Add('تم إغلاق العميل بنجاح');
نهاية؛
الإجراء TForm1.Button1Click(Sender: TObject);
يبدأ
ClientSocket1.Active:=true;
إذا ClientSocket1.Active بعد ذلك
memo1.Lines.Add('تم فتح العميل بنجاح')
آخر
memo1.Lines.Add('فشل فتح العميل');
نهاية؛
الإجراء TForm1.Button6Click(Sender: TObject);
يبدأ
ServerSocket1.Active:=true;
إذا ServerSocket1.Active بعد ذلك
memo1.Lines.Add("تم فتح الخادم بنجاح")
آخر
memo1.Lines.Add('فشل فتح الخادم');
نهاية؛
الإجراء TForm1.Button5Click(Sender: TObject);
يبدأ
ServerSocket1.Active:=false;
إذا ServerSocket1.Active بعد ذلك
memo1.Lines.Add("فشل إيقاف تشغيل الخادم")
آخر
memo1.Lines.Add('تم إغلاق الخادم بنجاح');
نهاية؛
الإجراء TForm1.Button3Click(Sender: TObject);
فار
FV_Date1_S,FV_Date2_S: سلسلة;
str_i,SendSize:integer;
Stream1:TWinSocketStream;
اي بي سي، قبل الميلاد: كلمة طويلة؛
يبدأ
stream1:=TWinSocketStream.Create(ClientSocket1.Socket,30000);
memo1.Lines.Add('-------------------إرسال طلب BIND إلى الخادم ------------------ --');
إن لم يكن ClientSocket1.Active بعد ذلك
يبدأ
memo1.Lines.Add('العميل غير مفتوح');
مخرج؛
نهاية؛
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)));
قبل الميلاد:=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('------------------تم إرسال طلب الربط-------------------- ------ -');
إذا كانstream1.WaitForData(5000) ثم
يبدأ
fillchar(cHead,sizeof(cHead),0);
fillchar(cbind_resp,sizeof(cBind_Resp),0);
Stream1.ReadBuffer(cHead,sizeof(cHead));
Stream1.ReadBuffer(cBind_resp,sizeof(cBind_resp));
نهاية؛
memo1.Lines.Add('cHead.MessageLength '+inttostr(ntohl(cHead.MessageLength)));
قبل الميلاد:=ntohl(cHead.CommandId);
memo1.Lines.Add('cHead.CommandId '+inttostr(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;
نهاية؛
الإجراء TForm1.Button4Click(Sender: TObject);
الملف: // النوع
{abc=سجل معبأ
الرأس:SGIPHead؛
إرسال:xSubmit؛
نهاية؛}
فار
FV_Date1_S,FV_Date2_S: سلسلة;
أنا، SendSize: عدد صحيح؛
ملف:://xxx:abc;
Stream2:twinsocketstream;
اي بي سي، قبل الميلاد: كلمة طويلة؛
السطر 1، السطر 2: الكلمة الطويلة؛
يبدأ
Stream2:=twinsocketstream.Create(clientsocket1.Socket,5000);
SendSize:=0;
memo1.Lines.Add('-----------------------------------------إرسال-- ---------');
إن لم يكن ClientSocket1.Active بعد ذلك
يبدأ
memo1.Lines.Add('------------------العميل غير مفتوح، فشل الإرسال--------------');
مخرج؛
نهاية؛
DateTimeToString(FV_Date1_S,'mmddhhnnss',now);
DateTimeToString(FV_Date2_S,'zzz',now);
fillChar(sSubmit,sizeof(sSubmit),0);
fillChar(sHead,sizeof(sHead),0);
مع إرسال القيام به
يبدأ
strpcopy(SPNumber,'4488');//;
رقم الشحن :='8613188890924';
عدد المستخدمين :=1; ملف://1-100
{for i:=1 to UserCount do
يبدأ
file://strpcopy(UserNumber[i-1].TelN,'8613065073355');//+T_Tel);// :صفيف TelCount; file://length هو UserCount
رقم المستخدم[i-1].TelN:='8613011725853';
نهاية؛}
رقم المستخدم:='8613188890924';
CorpID:='41027';//CorpID:='4488';//strpcopy(CorpID,FV_corpID);
نوع الخدمة:='4488';//FV_SPNumber);//'4488';
نوع الرسوم :=1;
قيمة الرسوم :='0';
القيمة المعطاة :='0';
AgentFlag :=0;
MORelatetoMTFlag :=2;
الأولوية :=0;
انتهاء الصلاحية :='';
وقت الجدول :='';
ريبورتفلاج :=1;
TP_pid :=0;
tp_udhi :=0;
ترميز الرسالة :=15;
نوع الرسالة :=0;
طول الرسالة :=htonl(161);
strpcopy(MessageContent,T_msg); file:// length is messageLength;
ملف://احتياطي :='';
نهاية؛
{line1:=sizeof(sHead);
line2:=sizeof(sSubmit);}
مع رئيس القيام به
يبدأ
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);
إذا كانstream2.WaitForData(5000) ثم
يبدأ
fillchar(cHead,sizeof(cHead),0);
fillchar(cSubmit_Resp,sizeof(cSubmit_Resp),0);
memo1.Lines.Add('قراءة إرسال الرأس ............');
يحاول
Stream2.ReadBuffer(cHead,sizeof(cHead));
Stream2.ReadBuffer(cSubmit_Resp,sizeof(cSubmit_Resp));
يستثني
على البريد: استثناء القيام به
memo1.Lines.Add(e.Message);
نهاية؛
memo1.Lines.Add('قراءة إرسال csubmit_resp ............');
file://stream2.ReadBuffer(cBind_Resp,sizeof(cBind_resp));
نهاية؛
Stream2.Free;
نهاية؛
الإجراء TForm1.ClientSocket1Read(Sender: TObject;
المقبس: TCustomWinSocket)؛
فار
CommandI,PackSize:Longword;
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-------------------')
آخر
إذا CommandI=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('Result'+inttostr(sBind_Resp.Result));
memo1.Lines.add('------------------end SGIP_UNBIND_RESP--------------------');
نهاية؛
الإجراء TForm1.Button7Click(Sender: TObject);
فار
FV_Date1_S,FV_Date2_S: سلسلة;
Stream3:TWinSocketStream;
يبدأ
Stream3:=TWinSocketStream.Create(clientSocket1.Socket,5000);
memo1.Lines.Add('-------------------أرسل طلب UnBIND إلى الخادم ------------------ --');
إن لم يكن ClientSocket1.Active بعد ذلك
يبدأ
memo1.Lines.Add('العميل غير مفتوح');
Stream3.free;
مخرج؛
نهاية؛
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);
إذا كانstream3.WaitForData(5000) ثم
يبدأ
Stream3.ReadBuffer(sHead,20);
نهاية؛
Stream3.Free;
نهاية؛
الإجراء TForm1.ServerSocket1ClientRead(Sender: TObject;
المقبس: TCustomWinSocket)؛
فار
RecvSize1,RecvSize2,DeSize:عدد صحيح;
CommandI,MessageSize:LongWord;
يبدأ
RecvSize1:=0;
RecvSize2:=0;
fillChar(cHead,SizeOf(cHead),0);
RecvSize1:=socket.ReceiveBuf(cHead,SizeOf(cHead));
CommandI:=ntohl(cHead.CommandId);
messageSize:=ntohl(cHead.MessageLength);
إذا CommandI=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('************************حدث خطأ في الاستجابة لطلب الربط************* ********* ******');
مخرج؛
نهاية؛
نهاية
آخر
إذا CommandI=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*************** ********** ******');
مخرج؛
نهاية؛
نهاية
آخر
إذا CommandI=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**************** ********' );
مخرج؛
نهاية؛
نهاية
آخر
يبدأ
نهاية؛
نهاية؛
نهاية.
//................................................................ ................ ............
الملف://البروتوكول
وحدة س ص؛
واجهة
الاستخدامات
com.sysUtils;
ثابت
SGIP_BIND =$1; ملف://التحقق من العميل
SGIP_BIND_RESP=80000001$؛ الملف://يرجع الخادم طلب التحقق
SGIP_UNBIND =$2; ملف://disconnect
SGIP_UNBIND_RESP = 80000002 دولار؛ ملف://العودة إلى حالة قطع الاتصال
SGIP_SUBMIT = ملف 3$: // أرسل رسالة قصيرة من MT إلى SMG
SGIP_SUBMIT_RESP = 80000003 دولار؛ ملف://Return SP إرسال حالة الرسائل القصيرة MT
SGIP_DELIVER =$4; يرسل الملف://SMG رسالة قصيرة MO إلى SP
SGIP_DELIVER_RESP = 80000004 دولار؛ ملف://العودة إلى حالة SMG
SGIP_REPORT = $5 file://يرسل الحالة الحالية لأمر الإرسال السابق إلى SP
SGIP_REPORT_RESP=80000005 دولار؛ ملف://حالة الاستجابة 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=8000000 دولار;
SGIP_MODIFYTELESEG=$b;
SGIP_MODIFYTELESEG_RESP=8000000 دولار;
SGIP_DELETETELESEG=$c;
SGIP_DELETETELESEG_RESP=8000000$;
SGIP_ADDSMG =$d;
SGIP_ADDSMG_RESP=8000000 دولار;
SGIP_MODIFYSMG=$e;
SGIP_MODIFYSMG_RESP=0000000$e;
SGIP_DELETESMG=$f;
SGIP_DELETESMG_RESP=8000000$;
SGIP_CHECKUSER=10$;
SGIP_CHECKUSER_RESP=80000010$;
SGIP_USERRPT =11$;
SGIP_USERRPT_RESP=80000011$;
SGIP_TRACE = 1000 دولار؛
SGIP_TRACE_RESP=80001000 دولار;
يكتب
TEMPTY=ملف السجل://سجل فارغ
نهاية؛
الملف: // رأس الرسالة
SGIPHead=سجل
طول الرسالة: ملف طويل: // الطول الإجمالي للرسالة (بايت)
معرف الأمر: ملف طويل: //commandID
SNumber1، SNumber2، SNumber3: ملف طويل: // الرقم التسلسلي
نهاية؛
الملف: // نص الرسالة
XBind=سجل //
LonginType :byte;
LonginPass :array[0..15] of char;
LonginName :array[0..15] of char;
احتياطي: مجموعة [0..7] من شار؛
نهاية؛
Bind_Resp=سجل
النتيجة: بايت؛
احتياطي: مجموعة [0..7] من شار؛
نهاية؛
//
Unbind=TEMPTY;
Unbind_Resp=TEMPTY;
//
TelCount=ملف السجل://رقم الهاتف المحمول
TelN :array[0..20] of char;
نهاية؛
XSubmit=سجل
SPNumber :صفيف [0..20] من شار؛
ChargeNumber :array[0..20] of char;
عدد المستخدمين: ملف: //1-100
UserNumber :array[0..20] of char;//TelCount; file://length هو UserCount
CorpID :array[0..4] of char;
نوع الخدمة :صفيف[0..9] من الحرف؛
نوع الرسوم : بايت؛
FeeValue :array[0..5] of char;
GiftValue :array[0..5] of char;
AgentFlag :byte;
MORelatetoMTFlag :byte;
الأولوية: بايت؛
ExireTime :array[0..15] of char;
وقت الجدولة :صفيف[0..15] من الحرف؛
تقرير العلامة: بايت؛
TP_pid: بايت؛
TP_udhi:بايت;
ترميز الرسالة: بايت؛
نوع الرسالة: بايت؛
طول الرسالة: كلمة طويلة؛
محتوى الرسالة : صفيف [0..160] من الملف: // الطول هو طول الرسالة؛
احتياطي: مجموعة [0..7] من شار؛
نهاية؛
Submit_Resp=سجل
النتيجة: بايت؛
احتياطي: مجموعة [0..7] من شار؛
نهاية؛
//
XDeliver=سجل
رقم المستخدم: صفيف[0..20] من الحرف؛
SPNumber :صفيف [0..27] من شار؛
{TP_pid :بايت؛
TP_udhi:بايت;
ترميز الرسالة: بايت؛
طول الرسالة :كلمة طويلة;}
محتوى الرسالة : صفيف [0..254] من الملف: // الطول هو طول الرسالة ؛
الاحتياطي: مجموعة [0..7] من شار؛
نهاية؛
Delivery_Resp=سجل
النتيجة: بايت؛
احتياطي: مجموعة [0..7] من شار؛
نهاية؛
//
XReport=سجل
SubSequNumber1,SubSequNumber2,SubSequNumber3 :longword;
نوع التقرير: بايت؛
رقم المستخدم: صفيف[0..20] من الحرف؛
الحالة: بايت؛
رمز الخطأ: بايت؛
احتياطي: مجموعة [0..7] من شار؛
نهاية؛
Report_Resp=سجل
النتيجة: بايت؛
احتياطي: مجموعة [0..7] من شار؛
نهاية؛
تطبيق
نهاية.
ملف://،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،//
الخادم
الوحدة الرئيسية؛
واجهة
الاستخدامات
Windows، الرسائل، SysUtils، المتغيرات، الفئات، الرسومات، عناصر التحكم، النماذج،
مربعات الحوار، xy، ScktComp، StdCtrls، Winsock؛
يكتب
TForm1 = الفئة (TForm)
مذكرة 1: مذكرة؛
ServerSocket1: TServerSocket؛
الإجراء ServerSocket1ClientRead(Sender: TObject;
المقبس: TCustomWinSocket)؛
الإجراء ServerSocket1ClientError(Sender: TObject;
المقبس: TCustomWinSocket؛ ErrorEvent: TERrorEvent؛
varErrorCode: Integer);
خاص
{تصريحات خاصة}
عام
{التصريحات العامة}
نهاية؛
فار
Form1: TForm1؛
تطبيق
{$R *.dfm}
الإجراء TForm1.ServerSocket1ClientRead(Sender: TObject;
المقبس: TCustomWinSocket)؛
يكتب
SendPack = سجل معبأ
الرأس: SGIHead؛
الرد: Bind_Resp؛
نهاية؛
فار
إعادة الرأس:SGIPHead؛
sresp:Bind_Resp;
إعادة الربط:xBind;
إعادة التسليم: XDeliver؛
تقرير التقرير:XReport؛
i1,i2:عدد صحيح;
سلسلة: سلسلة؛
S_Number1,S_Number2,S_Number3,longI1:longword;
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('خروج خطأ في رسالة Recv');
مخرج؛
نهاية؛
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 موافق');
نهاية
وإلا إذا كان 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);
المقبس.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 موافق');
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);
نهاية
وإلا إذا كان ReHead.CommandId=SGIP_REPORT إذن
يبدأ
fillChar(s_Pack,SizeOf(s_Pack),0);
fillChar(ReReport,SizeOf(ReReport),0);
المقبس.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(Sender: TObject;
المقبس: TCustomWinSocket؛ ErrorEvent: TERrorEvent؛
varErrorCode: Integer);
فار
errorMsg:string;
يبدأ
حدث خطأ في الحالة
ee General: errorMsg:='ee General';
eeSend: errorMsg:='eeSend';
eeReceive: errorMsg:='eeReceive';
eeConnect: errorMsg:='eeConnect';
eeDisconnect: errorMsg:='eeDisconnect';
eeAccept: errorMsg:='eeAccept';
نهاية؛
رمز الخطأ:=0;
Memo1.Lines.Add('خطأ في المقبس:'+errorMsg);
نهاية؛
نهاية.