หลังจากค้นหาบนอินเทอร์เน็ตเป็นเวลานาน ฉันไม่พบตัวอย่าง SGip เลย ฉันรู้สึกเศร้าและในที่สุดก็สร้างตัวอย่าง SGIP สำหรับ Delphi6.0
ประกอบด้วยเซิร์ฟเวอร์และไคลเอนต์ โปรโตคอลถูกแชร์ เซิร์ฟเวอร์เป็นการเชื่อมต่อแบบยาวที่ไม่บล็อก และไคลเอนต์บล็อกการเชื่อมต่อแบบสั้น
โปรแกรมยุ่งมากและรูปแบบก็แย่มาก ฉันหวังว่าผู้เชี่ยวชาญจะให้คำแนะนำฉันได้
([email protected],[email protected])
ไฟล์://client
หน่วย TestMain;
อินเตอร์เฟซ
การใช้งาน
Windows, ข้อความ, SysUtils, ตัวแปร, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม,
กล่องโต้ตอบ, ScktComp, StdCtrls, ExtCtrls, xy, winsock;
ค่าคงที่
FV_Sหมายเลข=3053112345;
FV_LoginPass='สวัสดี';
FV_LoginName='สวัสดี';
FV_SPNumber='12345';
T_Tel='13000000000';
FV_corpID='12345';
T_msg='ฉันเขียนชื่อของคุณไว้บนท้องฟ้า และมันก็ไม่ถูกลมพัดพาไป';
พิมพ์
TForm1 = คลาส (TForm)
Memo1: TMemo;
Button1: T ปุ่ม;
ClientSocket1: TClientSocket;
Button3: T ปุ่ม;
Button4: T ปุ่ม;
Button2: T ปุ่ม;
Button5: T ปุ่ม;
Button6: T ปุ่ม;
Button7: TButton;
ServerSocket1: TServerSocket;
แผง 1: TPanel;
ขั้นตอน Button2Click (ผู้ส่ง: TObject);
ขั้นตอน Button1Click (ผู้ส่ง: TObject);
ขั้นตอน Button6Click (ผู้ส่ง: TObject);
ขั้นตอน Button5Click (ผู้ส่ง: TObject);
ขั้นตอน Button3Click (ผู้ส่ง: TObject);
ขั้นตอน Button4Click (ผู้ส่ง: TObject);
ขั้นตอน ClientSocket1Read (ผู้ส่ง: TObject; ซ็อกเก็ต: TCustomWinSocket);
ขั้นตอน Button7Click (ผู้ส่ง: TObject);
ขั้นตอน ServerSocket1ClientRead (ผู้ส่ง: TObject;
ซ็อกเก็ต: TCustomWinSocket);
ส่วนตัว
{ประกาศส่วนตัว}
สาธารณะ
{ประกาศสาธารณะ}
file://client คำจำกัดความของโปรโตคอล
sHead: SGIHead; file://Message กำหนดส่วนหัวของข้อความ
sBind: XBind; file://Connection ยืนยันคำขอ
sBind_Resp: Bind_Resp; file://การตอบสนองต่อการตรวจสอบคำขอการเชื่อมต่อ
sส่ง: XSubmit; file://SP->SMG ส่ง SMS
sSubmit_Resp: Submit_Resp; file://SMG ตอบสนองต่อสถานะ SMS ที่ส่งโดย SP
sDeliver: XDeliver; file://SMG->SP ส่ง SMS
sDeliver_Resp: Deliver_Resp file://SP ตอบสนองต่อสถานะ SMS ที่ส่งโดย SMG
sReport: XReport; file://SMG->SP สถานะ SMS ก่อนหน้า
sReport_Resp: Report_Resp; file://Response สถานะการดำเนินการคำสั่ง
file://server คำจำกัดความของโปรโตคอล
cHead: SGIHead; file://Message กำหนดส่วนหัวของข้อความ
cBind: XBind; file://Connection ยืนยันคำขอ
cBind_Resp: Bind_Resp; file://Response to การตรวจสอบคำขอการเชื่อมต่อ
cส่ง: XSubmit; file://SP->SMG ส่ง SMS
cSubmit_Resp: Submit_Resp; file://SMG ตอบสนองต่อสถานะ SMS ที่ส่งโดย SP
cDeliver: XDeliver; file://SMG->SP ส่ง SMS
cDeliver_Resp: Deliver_Resp file://SP ตอบสนองต่อสถานะ SMS ที่ส่งโดย SMG
cReport: XReport; file://SMG->SP สถานะ SMS ก่อนหน้า
cReport_Resp: Report_Resp; file://Response สถานะการดำเนินการคำสั่ง
จบ;
var
แบบฟอร์ม 1: TForm1;
การดำเนินการ
{$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);
var
FV_Date1_S,FV_Date2_S: สตริง;
str_i,SendSize:จำนวนเต็ม;
สตรีม1:TWinSocketStream;
abc,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,ขนาดของ(sBind),0);
FillChar(sHead,ขนาดของ(sHead),0);
str_i:=ขนาดของ(sHead)+ขนาดของ(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, ขนาดของ (sHead));
stream1.WriteBuffer (sBind, ขนาดของ (sBind));
memo1.Lines.Add('sHead.MessageLength '+inttostr(ntohl(sHead.MessageLength)));
memo1.Lines.Add('sHead.CommandId '+inttostr(ntohl(sHead.CommandId)));
bc:=ntohl(เอบีซี);
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 request has been sended-------------------- ------ -');
ถ้า stream1.WaitForData(5000) แล้ว
เริ่ม
fillchar(cHead,ขนาดของ(cHead),0);
fillchar(cbind_resp,ขนาดของ(cBind_Resp),0);
stream1.ReadBuffer (cHead, ขนาดของ (cHead));
stream1.ReadBuffer(cBind_resp,ขนาดของ(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);
ไฟล์://type
{abc=บันทึกที่แพ็คแล้ว
หัว:SGIPHead;
ส่ง:xส่ง;
จบ;}
var
FV_Date1_S,FV_Date2_S: สตริง;
ฉัน, SendSize: จำนวนเต็ม;
ไฟล์://xxx:abc;
สตรีม2: สตรีมซ็อกเก็ตคู่;
abc,bc:คำยาว;
line1,line2:คำยาว;
เริ่ม
สตรีม2:=twinsocketstream.Create(clientsocket1.Socket,5000);
ขนาดส่ง:=0;
memo1.Lines.Add('-----------------------------ส่ง----------------- ---------');
ถ้าไม่ใช่ ClientSocket1.Active แล้ว
เริ่ม
memo1.Lines.Add('------------------The client is not open, send failed-------------');
ออก;
จบ;
DateTimeToString(FV_Date1_S,'mmddhhnnss',ตอนนี้);
DateTimeToString(FV_Date2_S,'zzz',ตอนนี้);
FillChar(sส่ง,ขนาดของ(sส่ง),0);
FillChar(sHead,ขนาดของ(sHead),0);
ด้วยการส่งทำ
เริ่ม
strpcopy(SPNumber,'4488');//;
หมายเลขค่าธรรมเนียม :='8613188890924';
จำนวนผู้ใช้ :=1; file://1-100
{สำหรับ i:=1 ถึง UserCount ทำ
เริ่ม
file://strpcopy(UserNumber[i-1].TelN,'8613065073355');//+T_Tel);// :array ของ TelCount; file://length คือ UserCount
UserNumber[i-1].TelN:='8613011725853';
จบ;}
ชื่อผู้ใช้:='8613188890924';
CorpID:='41027';//CorpID:='4488';//strpcopy(CorpID,FV_corpID);
ประเภทบริการ:='4488';//FV_SPNumber);//'4488';
ประเภทค่าธรรมเนียม :=1;
มูลค่าค่าธรรมเนียม :='0';
ค่าที่กำหนด :='0';
ตัวแทนแฟล็ก :=0;
เกี่ยวข้องกับ MTFlag :=2;
ลำดับความสำคัญ :=0;
เวลาหมดอายุ :='';
กำหนดเวลา :='';
รายงานแฟล็ก :=1;
TP_PID :=0;
tp_udhi :=0;
การเข้ารหัสข้อความ :=15;
ประเภทข้อความ :=0;
ความยาวข้อความ :=htonl(161);
strpcopy(MessageContent,T_msg); file://length คือ MessageLength;
ไฟล์://จอง :='';
จบ;
{line1:=sizeof(sHead);
line2:=sizeof(sส่ง);}
กับ sHead ทำ
เริ่ม
abc:=htonl(FV_SNumber);
MessageLength:=htonl(ขนาดของ(sHead)+ขนาดของ(sส่ง)-3);
CommandId:=htonl(SGIP_ส่ง);
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,ขนาดของ(cHead),0);
fillchar(cSubmit_Resp,ขนาดของ(cSubmit_Resp),0);
memo1.Lines.Add('อ่านส่งหัวหน้า ............');
พยายาม
stream2.ReadBuffer (cHead, ขนาดของ (cHead));
stream2.ReadBuffer(cSubmit_Resp,ขนาดของ(cSubmit_Resp));
ยกเว้น
บน e: ข้อยกเว้นทำ
memo1.Lines.Add(e.ข้อความ);
จบ;
memo1.Lines.Add('อ่านส่ง csubmit_resp ............');
ไฟล์://stream2.ReadBuffer(cBind_Resp,ขนาดของ(cBind_resp));
จบ;
สตรีม2.ฟรี;
จบ;
ขั้นตอน TForm1.ClientSocket1Read (ผู้ส่ง: TObject;
ซ็อกเก็ต: TCustomWinSocket);
var
commandI, PackSize:คำยาว;
Recv1I, Recv2I: จำนวนเต็ม;
เริ่ม
FillChar(sHead,ขนาดของ(sHead),0);
FillChar(sBind,ขนาดของ(sBind),0);
Recv1I:=socket.ReceiveBuf(sHead,sizeof(sHead));
commandI:=ntohl(sHead.CommandId);
PackSize:=ntohl(sHead.MessageLength);
ถ้า commandI=SGIP_UNBIND_RESP แล้ว
เริ่ม
memo1.Lines.Add('------------------ ได้รับคำขอ SGIP_UNBIND_RESP -------------------');
ออก;
จบ;
Recv2I:=socket.ReceiveBuf(sBind,sizeof(sBind));
ถ้า commandI=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('ผลลัพธ์ '+inttostr(sBind_Resp.Result));
memo1.Lines.add('------------------end SGIP_UNBIND_RESP-------------------');
จบ;
ขั้นตอน TForm1.Button7Click (ผู้ส่ง: TObject);
var
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,ขนาดของ(sHead),0);
sHead.MessageLength:=htonl(ขนาดของ(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);
จบ;
สตรีม3.ฟรี;
จบ;
ขั้นตอน TForm1.ServerSocket1ClientRead (ผู้ส่ง: TObject;
ซ็อกเก็ต: TCustomWinSocket);
var
RecvSize1, RecvSize2, DeSize: จำนวนเต็ม;
commandI, MessageSize: LongWord;
เริ่ม
RecvSize1:=0;
RecvSize2:=0;
FillChar(cHead,ขนาดของ(cHead),0);
RecvSize1:=socket.ReceiveBuf(cHead,SizeOf(cHead));
commandI:=ntohl(cHead.CommandId);
MessageSize:=ntohl(cHead.MessageLength);
ถ้า commandI=SGIP_BIND แล้ว
เริ่ม
memo1.Lines.Add('************************ได้รับคำขอผูกมัด****************** ** ***');
FillChar(cBind,ขนาดของ(cBind),0);
FillChar(cBind_Resp,ขนาดของ(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(ขนาดของ(cHead)+ขนาดของ(cBind_Resp));
cBind_Resp.ผลลัพธ์:=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,ขนาดของ(cDeliver),0);
FillChar(cDeliver_Resp,ขนาดของ(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(ขนาดของ(cHead)+ขนาดของ(cDeliver_Resp));
cDeliver_Resp.ผลลัพธ์:=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(ขนาดของ(cHead));
memo1.Lines.Add('ตอบกลับ SGIP_UNBIND******************************');
RecvSize2:=Socket.SendBuf(cHead,sizeOf(cHead));
ถ้า RecvSize2<>ntohl(cHead.MessageLength) แล้ว
เริ่ม
memo1.Lines.Add('************************SGIP_UNBIND ส่งข้อผิดพลาด****************** ******' );
ออก;
จบ;
จบ
อื่น
เริ่ม
จบ;
จบ;
จบ.
//................................................ ................ ............
ไฟล์://โปรโตคอล
หน่วย xy;
อินเตอร์เฟซ
การใช้งาน
SysUtils;
ค่าคงที่
SGIP_BIND =$1; file://ยืนยันไคลเอ็นต์
SGIP_BIND_RESP=$80000001; file://server ส่งคืนคำขอตรวจสอบ
SGIP_UNBIND =$2; file://disconnect
SGIP_UNBIND_RESP =$80000002; file:// กลับสู่สถานะตัดการเชื่อมต่อ
SGIP_SUBMIT =$3; file://ส่งข้อความสั้น MT ถึง SMG
SGIP_SUBMIT_RESP =$80000003; file://Return SP สถานะข้อความสั้น MT
SGIP_DELIVER =$4; file://SMG ส่งข้อความสั้น MO ไปยัง SP
SGIP_DELIVER_RESP =$80000004; file:// กลับสู่สถานะ SMG
SGIP_REPORT =$5; file://Sends สถานะปัจจุบันของคำสั่งส่งก่อนหน้าไปยัง SP
SGIP_REPORT_RESP=$80000005; file://Response SMG สถานะ
file://The โปรโตคอลต่อไปนี้ไม่มีประโยชน์สำหรับ 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_DELETELESEG_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 =$1,000; //
SGIP_TRACE_RESP=$80001000; //
พิมพ์
TEMPTY=ไฟล์บันทึก://empty record
จบ;
ไฟล์://ส่วนหัวของข้อความ
SGIPHead=บันทึก
MessageLength:longword; file://ความยาวรวมของข้อความ (ไบต์)
CommandId :คำยาว; file://commandID
SNumber1,SNumber2,SNumber3:คำยาว; file://serial number
จบ;
ไฟล์://เนื้อหาข้อความ
XBind=บันทึก //
LonginType :ไบต์;
LonginPass :array[0..15] ของถ่าน;
LonginName :array[0..15] ของถ่าน;
สำรอง :array[0..7] ของถ่าน;
จบ;
Bind_Resp=บันทึก
ผลลัพธ์ :ไบต์;
สำรอง :array[0..7] ของถ่าน;
จบ;
-
เลิกผูก=TEMPTY;
Unbind_Resp=TEMPTY;
-
TelCount=บันทึกไฟล์://หมายเลขโทรศัพท์มือถือ
TelN :array[0..20] ของถ่าน;
จบ;
XSubmit=บันทึก
SPNumber :array[0..20] ของถ่าน;
ChargeNumber :array[0..20] ของถ่าน;
จำนวนผู้ใช้ :byte; file://1-100
UserNumber :array[0..20] ของ char;//TelCount; file://length คือ UserCount
CorpID :array[0..4] ของถ่าน;
ServiceType :array[0..9] ของถ่าน;
ประเภทค่าธรรมเนียม :byte;
FeeValue :array[0..5] ของถ่าน;
GiveValue :array[0..5] ของถ่าน;
AgentFlag : ไบต์;
เพิ่มเติมเกี่ยวกับ MTFlag :byte;
ลำดับความสำคัญ:ไบต์;
ExpireTime :array[0..15] ของถ่าน;
ScheduleTime :array[0..15] ของถ่าน;
ReportFlag : ไบต์;
TP_pid:ไบต์;
TP_udhi:ไบต์;
การเข้ารหัสข้อความ:ไบต์;
MessageType:ไบต์;
ความยาวข้อความ:คำยาว;
MessageContent :array[0..160] ของ char; file://length คือ MessageLength;
สำรอง :array[0..7] ของถ่าน;
จบ;
Submit_Resp=บันทึก
ผลลัพธ์ :ไบต์;
สำรอง :array[0..7] ของถ่าน;
จบ;
-
XDeliver=บันทึก
UserNumber :array[0..20] ของถ่าน;
SPNumber :array[0..27] ของถ่าน;
{TP_pid :ไบต์;
TP_udhi:ไบต์;
การเข้ารหัสข้อความ:ไบต์;
ความยาวข้อความ :คำยาว;}
MessageContent :array[0..254] ของ char; file://length คือ MessageLength;
ตัวสำรอง :array[0..7] ของถ่าน;
จบ;
Deliver_Resp=บันทึก
ผลลัพธ์ :ไบต์;
สำรอง :array[0..7] ของถ่าน;
จบ;
-
XReport=บันทึก
SubSequNumber1,SubSequNumber2,SubSequNumber3 :คำยาว;
ประเภทรายงาน :ไบต์;
UserNumber :array[0..20] ของถ่าน;
สถานะ :ไบต์;
รหัสข้อผิดพลาด: ไบต์;
สำรอง :array[0..7] ของถ่าน;
จบ;
Report_Resp=บันทึก
ผลลัพธ์ :ไบต์;
สำรอง :array[0..7] ของถ่าน;
จบ;
การดำเนินการ
จบ.
ไฟล์://,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//
เซิร์ฟเวอร์
หน่วยหลัก;
อินเตอร์เฟซ
การใช้งาน
Windows, ข้อความ, SysUtils, ตัวแปร, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม,
กล่องโต้ตอบ, xy, ScktComp, StdCtrls, winsock;
พิมพ์
TForm1 = คลาส (TForm)
Memo1: TMemo;
ServerSocket1: TServerSocket;
ขั้นตอน ServerSocket1ClientRead (ผู้ส่ง: TObject;
ซ็อกเก็ต: TCustomWinSocket);
ขั้นตอน ServerSocket1ClientError (ผู้ส่ง: TObject;
ซ็อกเก็ต: TCustomWinSocket; ErrorEvent: TERrorEvent;
varErrorCode: จำนวนเต็ม);
ส่วนตัว
{ประกาศส่วนตัว}
สาธารณะ
{ประกาศสาธารณะ}
จบ;
var
แบบฟอร์ม 1: TForm1;
การดำเนินการ
{$R *.dfm}
ขั้นตอน TForm1.ServerSocket1ClientRead (ผู้ส่ง: TObject;
ซ็อกเก็ต: TCustomWinSocket);
พิมพ์
SendPack = บันทึกที่อัดแน่น
หัว: SGIHead;
ตอบกลับ: Bind_Resp;
จบ;
var
ReHead:SGIPHead;
sresp:Bind_Resp;
ผูกใหม่:xBind;
ส่งอีกครั้ง: XDeliver;
รายงาน:XReport;
i1,i2:จำนวนเต็ม;
STR:สตริง;
S_Number1,S_Number2,S_Number3,longI1:คำยาว;
s_Pack:SendPack;
เริ่ม
fillchar(sresp,ขนาดของ(sresp),0);
fillchar (ReHead, ขนาดของ (ReHead), 0);
i1:=Socket.ReceiveBuf (ReHead, ขนาดของ (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 แล้ว
เริ่มต้นไฟล์://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, ขนาดของ (ReHead));
ถ้า i1<>sizeof(ReHead) แล้ว
memo1.Lines.Add('ส่งข้อผิดพลาด SGIP_UNBIND_Resp')
อื่น
memo1.Lines.Add('ส่ง SGIP_UNBIND_Resp ตกลง');
จบ
อย่างอื่นถ้า ReHead.CommandId=SGIP_BIND แล้ว
start file://SMG ส่งข้อความสั้น MO ไปยัง SP
FillChar(s_Pack,ขนาดของ(s_Pack),0);
FillChar(ReBind,SizeOf(ReBind),0);
socket.ReceiveBuf (ReBind, SizeOf (ReBind));
s_Pack.head.MessageLength:=htonl(ขนาดของ(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.ผลลัพธ์:=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,ขนาดของ(s_Pack),0);
FillChar(ReDeliver,SizeOf(ReDeliver),0);
Socket.ReceiveBuf (ReDeliver, SizeOf (ReDeliver));
s_Pack.head.MessageLength:=htonl(ขนาดของ(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.ผลลัพธ์:=0;
ถ้า socket.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);
ไฟล์://longI1:=ntohl(ReDeliver.MessageLength);
ไฟล์://memo1.Lines.Add(inttostr(longI1)+' '+inttostr(ReDeliver.MessageLength));
memo1.Lines.Add(ReDeliver.MessageContent);
จบ
อย่างอื่นถ้า ReHead.CommandId=SGIP_REPORT แล้ว
เริ่ม
FillChar(s_Pack,ขนาดของ(s_Pack),0);
FillChar(รายงาน,ขนาดของ(รายงาน),0);
Socket.ReceiveBuf (รายงานรายงาน SizeOf (รายงาน));
s_Pack.head.MessageLength:=htonl(ขนาดของ(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.ผลลัพธ์:=0;
ถ้า socket.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: จำนวนเต็ม);
var
errorMsg:สตริง;
เริ่ม
กรณีข้อผิดพลาดเหตุการณ์ของ
eeGeneral: errorMsg:='eeGeneral';
eeSend: errorMsg:='eeSend';
eeReceive: errorMsg:='eeReceive';
eeConnect: errorMsg:='eeConnect';
eeDisconnect: errorMsg:='eeDisconnect';
eeAccept: errorMsg:='eeAccept';
จบ;
รหัสข้อผิดพลาด:=0;
Memo1.Lines.Add('ข้อผิดพลาดซ็อกเก็ต:'+errorMsg);
จบ;
จบ.