오랫동안 인터넷에서 검색한 결과 SGip 예제를 찾을 수 없어서 아쉽게도 마침내 Delphi6.0용 SGIP 예제를 만들었습니다.
서버와 클라이언트가 포함되어 있으며 프로토콜은 공유되며 서버는 비차단 긴 연결이고 클라이언트는 차단 짧은 연결입니다.
프로그램이 매우 지저분하고 스타일도 매우 좋지 않습니다. 전문가들이 저에게 조언을 해줄 수 있기를 바랍니다.
([email protected],[email protected])
파일://클라이언트
단위 TestMain;
인터페이스
용도
Windows, 메시지, SysUtils, 변형, 클래스, 그래픽, 컨트롤, 양식,
대화 상자, ScktComp, StdCtrls, ExtCtrls, xy, Winsock;
const
FV_S번호=3053112345;
FV_LoginPass='안녕하세요';
FV_LoginName='안녕하세요';
FV_SPNumber='12345';
T_Tel='13000000000';
FV_corpID='12345';
T_msg='하늘에 당신의 이름을 썼는데 바람에 사라지지 않았습니다';
유형
TForm1 = 클래스(TForm)
메모1: TMemo;
버튼1: T버튼;
ClientSocket1: TClientSocket;
Button3: T버튼;
Button4: T버튼;
Button2: T버튼;
Button5: T버튼;
Button6: T버튼;
Button7: T버튼;
서버소켓1: TServerSocket;
패널1: T패널;
PROcedure Button2Click(Sender: TObject);
절차 Button1Click(Sender: TObject);
절차 Button6Click(보내는 사람: TObject);
절차 Button5Click(Sender: TObject);
절차 Button3Click(보내는 사람: TObject);
절차 Button4Click(보내는 사람: TObject);
절차 ClientSocket1Read(Sender: TObject; 소켓: TCustomWinSocket);
절차 Button7Click(보내는 사람: TObject);
프로시저 ServerSocket1ClientRead(Sender: TObject;
소켓: TCustomWinSocket);
사적인
{비공개 선언}
공공의
{공개 선언}
file://클라이언트 프로토콜 정의
sHead: SGIHead; file://메시지 헤더 정의
sBind: XBind;file://연결 요청 확인
sBind_Resp: Bind_Resp; file://연결 요청 확인에 대한 응답
s제출: XSubmit; file://SP->SMG SMS 제출
sSubmit_Resp: Submit_Resp; file://SMG는 SP가 제출한 SMS 상태에 응답합니다.
sDeliver: XDeliver; file://SMG->SP SMS 제출
sDeliver_Resp: Deliver_Resp; file://SP는 SMG가 제출한 SMS 상태에 응답합니다.
sReport: XReport; file://SMG->SP 이전 SMS 상태
sReport_Resp: Report_Resp; file://Response 명령 실행 상태
file://서버 프로토콜 정의
cHead: SGIHead; file://메시지 헤더 정의
cBind: XBind;file://연결 요청 확인
cBind_Resp: Bind_Resp; file://연결 요청 확인에 대한 응답
c제출: XSubmit; file://SP->SMG SMS 제출
cSubmit_Resp: Submit_Resp; file://SMG는 SP가 제출한 SMS 상태에 응답합니다.
cDeliver: XDeliver; file://SMG->SP SMS 제출
cDeliver_Resp: Deliver_Resp; file://SP는 SMG가 제출한 SMS 상태에 응답합니다.
cReport: XReport; file://SMG->SP 이전 SMS 상태
cReport_Resp: Report_Resp; file://Response 명령 실행 상태
끝;
var
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);
var
FV_Date1_S,FV_Date2_S: 문자열;
str_i,SendSize:정수;
stream1:TWinSocketStream;
abc,bc:longWord;
시작하다
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)));
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('------바인드 요청이 전송되었습니다------- ------ -');
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)));
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(Sender: TObject);
파일://유형
{abc=포장된 레코드
머리:SGIP머리;
제출:x제출;
끝;}
var
FV_Date1_S,FV_Date2_S: 문자열;
i,SendSize:정수;
파일://xxx:abc;
stream2:twinsocketstream;
abc,bc:긴 단어;
line1,line2:긴 단어;
시작하다
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);
ssubmit do와 함께
시작하다
strpcopy(SPNumber,'4488');//;
청구번호 :='8613188890924';
사용자수 :=1;파일://1-100;
{for i:=1 to UserCount do
시작하다
file://strpcopy(UserNumber[i-1].TelN,'8613065073355');//+T_Tel);// : TelCount 파일://길이의 배열은 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;
만료시간 :='';
일정시간 :='';
ReportFlag :=1;
TP_pid :=0;
tp_udhi :=0;
메시지코딩 :=15;
메시지 유형 :=0;
MessageLength :=htonl(161);
strpcopy(MessageContent,T_msg); 파일://길이는 MessageLength입니다.
파일://예약 :='';
끝;
{line1:=sizeof(sHead);
line2:=sizeof(s제출);}
sHead do와 함께
시작하다
abc:=htonl(FV_SNumber);
MessageLength:=htonl(sizeof(sHead)+sizeof(sSubmit)-3);
CommandId:=htonl(SGIP_Submit);
S번호1:=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));
제외하고
e:예외 수행
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);
var
명령I,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);
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('Result '+inttostr(sBind_Resp.Result));
memo1.Lines.add('-----end SGIP_UNBIND_RESP------');
끝;
절차 TForm1.Button7Click(Sender: TObject);
var
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);
var
RecvSize1,RecvSize2,DeSize:정수;
명령I,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);
if (RecvSize2+RecvSize1)<>MessageSize then
시작하다
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));
if (RecvSize1+RecvSize2)<>ntohl(cHead.MessageLength) then
시작하다
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);
if (RecvSize2+RecvSize1)<>MessageSize then
시작하다
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));
if (RecvSize1+RecvSize2)<>ntohl(cHead.MessageLength) then
시작하다
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 전송 오류******************** ******' );
출구;
끝;
끝
또 다른
시작하다
끝;
끝;
끝.
//................................................. ................ ............
파일://프로토콜
단위 xy;
인터페이스
용도
SysUtils;
const
SGIP_BIND =$1; file://클라이언트 확인
SGIP_BIND_RESP=$80000001; file://서버가 확인 요청을 반환합니다.
SGIP_UNBIND =$2 파일://연결 끊기
SGIP_UNBIND_RESP =$80000002; file://연결 끊김 상태로 돌아가기
SGIP_SUBMIT =$3; file://SMG에 MT 단문 메시지 제출
SGIP_SUBMIT_RESP =$80000003; file://SP 제출 MT 단문 메시지 상태 반환
SGIP_DELIVER =$4; file://SMG가 SP에 MO 단문 메시지를 보냅니다.
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=$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; //
유형
TEMPTY=레코드 파일://빈 레코드
끝;
파일://메시지 헤더
SGIPHead=기록
MessageLength:longword file://메시지의 전체 길이(바이트)
명령ID :긴단어파일://명령ID;
SNumber1,SNumber2,SNumber3:longword 파일://일련번호;
끝;
파일://메시지 본문
XBind=기록 //
롱인타입 :byte;
LonginPass :문자 배열[0..15];
LonginName :문자의 배열[0..15];
예약 : char의 배열[0..7];
끝;
Bind_Resp=녹화
결과 :바이트;
예약 : char의 배열[0..7];
끝;
//
바인딩 해제=TEMPTY;
Unbind_Resp=TEMPTY;
//
TelCount=녹화파일://휴대전화번호
TelN :문자 배열[0..20];
끝;
XSubmit=녹화
SPNumber :문자의 배열[0..20];
ChargeNumber :문자열의 배열[0..20];
사용자수:바이트;파일://1-100
UserNumber :array[0..20] of char;//TelCount 파일://길이는 UserCount입니다.
CorpID :문자열의 배열[0..4];
ServiceType :문자의 배열[0..9];
수수료 유형 :byte;
FeeValue :문자열의 배열[0..5];
주어진값 : char의 배열[0..5];
AgentFlag :바이트;
MORelatetoMTFlag :byte;
우선순위:바이트;
ExpireTime : 배열[0..15] 문자;
ScheduleTime :문자 배열[0..15];
ReportFlag :바이트;
TP_pid:바이트;
TP_udhi:바이트;
메시지코딩:바이트;
메시지 유형:바이트;
메시지 길이:긴 단어;
char의 MessageContent :array[0..160]는 file://length입니다.
예약 : char의 배열[0..7];
끝;
Submit_Resp=기록
결과 :바이트;
예약 : char의 배열[0..7];
끝;
//
XDeliver=기록
UserNumber :문자열의 배열[0..20];
SPNumber :문자의 배열[0..27];
{TP_pid:바이트;
TP_udhi:바이트;
메시지코딩:바이트;
메시지길이 :longword;}
char의 MessageContent :array[0..254]는 file://length입니다.
예약자 : char의 배열[0..7];
끝;
Deliver_Resp=녹화
결과 :바이트;
예약 : char의 배열[0..7];
끝;
//
XReport=기록
SubSequNumber1,SubSequNumber2,SubSequNumber3 :longword;
보고서 유형 :바이트;
UserNumber :문자열의 배열[0..20];
상태 :바이트;
오류 코드:바이트;
예약 : char의 배열[0..7];
끝;
Report_Resp=녹화
결과 :바이트;
예약 : char의 배열[0..7];
끝;
구현
끝.
파일://,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//
섬기는 사람
유닛 메인;
인터페이스
용도
Windows, 메시지, SysUtils, 변형, 클래스, 그래픽, 컨트롤, 양식,
대화상자, xy, ScktComp, StdCtrls, Winsock;
유형
TForm1 = 클래스(TForm)
메모1: TMemo;
서버소켓1: TServerSocket;
프로시저 ServerSocket1ClientRead(Sender: TObject;
소켓: TCustomWinSocket);
프로시저 ServerSocket1ClientError(Sender: TObject;
소켓: TCustomWinSocket: TErrorEvent;
varErrorCode: 정수);
사적인
{비공개 선언}
공공의
{공개 선언}
끝;
var
Form1: TForm1;
구현
{$R *.dfm}
프로시저 TForm1.ServerSocket1ClientRead(Sender: TObject;
소켓: TCustomWinSocket);
유형
SendPack = 압축된 레코드
머리: SGI헤드;
resp: Bind_Resp;
끝;
var
ReHead:SGIP헤드;
sresp:Bind_Resp;
리바인드:x바인드;
재배달: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인 경우
start file://SMG가 SP에 MO 단문 메시지를 보냅니다.
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;
if 소켓.SendBuf(s_Pack,SizeOf(s_Pack)) <>SizeOf(s_Pack) then
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);
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;
if 소켓.SendBuf(s_Pack,SizeOf(s_Pack)) <>SizeOf(s_Pack) then
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: TErrorEvent;
varErrorCode: 정수);
var
오류 메시지:문자열;
시작하다
오류이벤트
eeGeneral: errorMsg:='eeGeneral';
eeSend: errorMsg:='eeSend';
eeReceive: errorMsg:='eeReceive';
eeConnect: errorMsg:='eeConnect';
eeDisconnect: errorMsg:='eeDisconnect';
eeAccept: errorMsg:='eeAccept';
끝;
오류코드:=0;
Memo1.Lines.Add('소켓 오류:'+errorMsg);
끝;
끝.