インターネットで長い間探しましたが、SGip サンプルが見つかりませんでした。残念ながら、Delphi6.0 用の SGIP サンプルを作成しました。
サーバーとクライアントが含まれており、プロトコルは共有され、サーバーは非ブロッキングの長い接続、クライアントはブロッキングの短い接続です。
プログラムは非常に乱雑で、スタイルも非常に悪いので、専門家にアドバイスをいただければ幸いです。
([email protected]、[email protected])
ファイル://クライアント
ユニット TestMain;
インタフェース
用途
ウィンドウ、メッセージ、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)
メモ1: Tメモ;
ボタン 1: T ボタン;
ClientSocket1: TClientSocket;
ボタン 3: T ボタン;
ボタン 4: T ボタン;
ボタン 2: T ボタン;
ボタン 5: T ボタン;
ボタン6: Tボタン;
Button7:Tボタン;
ServerSocket1: TServerSocket;
パネル1: Tパネル;
手順 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; file://接続要求の検証
sBind_Resp: Bind_Resp file://接続要求検証への応答
sSubmit: 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 コマンドの実行ステータス;
終わり;
変数
フォーム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);
変数
FV_Date1_S、FV_Date2_S: 文字列;
str_i,SendSize:整数;
ストリーム1:TWinSocketStream;
abc,bc:ロングワード;
始める
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));
stream1.無料。
終わり;
プロシージャ TForm1.Button4Click(送信者: TObject);
ファイル://タイプ
{abc=パックされたレコード
ヘッド:SGIP ヘッド;
送信:x送信;
終わり;}
変数
FV_Date1_S、FV_Date2_S:文字列;
i,SendSize:整数;
ファイル://xxx:abc;
ストリーム2:ツインソケットストリーム;
abc,bc:ロングワード;
行1、行2:ロングワード;
始める
stream2:=twinsocketstream.Create(clientsocket1.Socket,5000);
送信サイズ:=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 から UserCount まで
始める
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);
ServiceType:='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 です。
file://予約:='';
終わり;
{line1:=sizeof(sHead);
line2:=sizeof(sSubmit);}
sHead doで
始める
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));
を除外する
e:例外で実行します
memo1.Lines.Add(e.Message);
終わり;
memo1.Lines.Add('read submit csubmit_resp ......');
file://stream2.ReadBuffer(cBind_Resp,sizeof(cBind_resp));
終わり;
stream2.無料。
終わり;
プロシージャ TForm1.ClientSocket1Read(送信者: TObject;
ソケット: TCustomWinSocket);
変数
コマンドI、パックサイズ:ロングワード;
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('Result '+inttostr(sBind_Resp.Result));
memo1.Lines.add('-------------------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',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.無料。
終わり;
プロシージャ TForm1.ServerSocket1ClientRead(送信者: TObject;
ソケット: TCustomWinSocket);
変数
RecvSize1、RecvSize2、DeSize:整数;
コマンドI、メッセージサイズ:LongWord;
始める
RecvSize1:=0;
RecvSize2:=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);
if (RecvSize2+RecvSize1)<>メッセージサイズ 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('************************バインド要求に対する応答でエラーが発生しました************* ********* ******');
出口;
終わり;
終わり
それ以外
コマンド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);
if (RecvSize2+RecvSize1)<>メッセージサイズ 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 リクエストエラーへの応答************** ********** ******');
出口;
終わり;
終わり
それ以外
コマンド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));
if RecvSize2<>ntohl(cHead.MessageLength) then
始める
memo1.Lines.Add('************************SGIP_UNBIND 送信エラー**************** ********' );
出口;
終わり;
終わり
それ以外
始める
終わり;
終わり;
終わり。
//................................................................ ......................................
ファイル://プロトコル
単位xy;
インタフェース
用途
SysUtils;
定数
SGIP_BIND =$1; file://クライアントを確認します。
SGIP_BIND_RESP=$80000001; file://サーバーが検証リクエストを返します。
SGIP_UNBIND =$2;
SGIP_UNBIND_RESP =$80000002; file://切断状態に戻る
SGIP_SUBMIT =$3; file://MT ショート メッセージを SMG に送信します。
SGIP_SUBMIT_RESP =$80000003; file://SP 送信 MT ショート メッセージ ステータスを返す
SGIP_DELIVER =$4; file://SMG が MO ショート メッセージを SP に送信します。
SGIP_DELIVER_RESP =$80000004; file://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=$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_USERPT =$11;
SGIP_USERPT_RESP=$80000011;
SGIP_TRACE =$1000;
SGIP_TRACE_RESP=$80001000;
タイプ
TEMPTY=レコード ファイル://空のレコード
終わり;
file://メッセージヘッダー
SGIPHead=レコード
MessageLength:longword; file://メッセージの合計長 (バイト)
コマンド ID :ロングワード;
SNumber1,SNumber2,SNumber3:ロングワード ファイル://シリアル番号;
終わり;
ファイル://メッセージ本文
XBind=レコード //
Longin タイプ:バイト;
LonginPass :配列[0..15] の文字;
LonginName :配列[0..15] の文字;
文字の :array[0..7] を予約します。
終わり;
Bind_Resp=レコード
結果:バイト;
文字の :array[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 file://length は UserCount;
CorpID :配列[0..4] の文字;
ServiceType :配列[0..9] の文字;
料金タイプ:バイト;
FeeValue :配列[0..5] の文字;
GivenValue :array[0..5] の文字;
エージェントフラグ:バイト;
MTFlag に関連する:バイト;
優先順位:バイト;
ExpireTime :配列[0..15] の文字;
ScheduleTime :配列[0..15] の文字;
レポートフラグ:バイト;
TP_pid:バイト;
TP_udhi:バイト;
メッセージコーディング:バイト;
メッセージタイプ:バイト;
メッセージの長さ:ロングワード;
MessageContent :array[0..160] of char; file://length は MessageLength です。
文字の :array[0..7] を予約します。
終わり;
Submit_Resp=レコード
結果:バイト;
文字の :array[0..7] を予約します。
終わり;
//
XDeliver=レコード
ユーザー番号:配列[0..20] の文字;
SPNumber :配列[0..27] の文字;
{TP_pid :バイト;
TP_udhi:バイト;
メッセージコーディング:バイト;
メッセージの長さ :ロングワード;}
MessageContent :array[0..254] の char; file://length は MessageLength です。
リザーバ:配列[0..7] の文字;
終わり;
Deliver_Resp=レコード
結果:バイト;
文字の :array[0..7] を予約します。
終わり;
//
XReport=レコード
SubSequNumber1、SubSequNumber2、SubSequNumber3 :ロングワード;
レポートタイプ:バイト;
ユーザー番号:配列[0..20] の文字;
状態:バイト;
エラーコード:バイト;
文字の :array[0..7] を予約します。
終わり;
Report_Resp=記録
結果:バイト;
文字の :array[0..7] を予約します。
終わり;
実装
終わり。
ファイル://、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、//
サーバ
ユニットメイン。
インタフェース
用途
ウィンドウ、メッセージ、SysUtils、バリアント、クラス、グラフィックス、コントロール、フォーム、
ダイアログ、xy、ScktComp、StdCtrls、winsock;
タイプ
TForm1 = クラス(TForm)
メモ1: Tメモ;
ServerSocket1: TServerSocket;
プロシージャ ServerSocket1ClientRead(送信者: TObject;
ソケット: TCustomWinSocket);
プロシージャ ServerSocket1ClientError(送信者: TObject;
ソケット: TCustomWinSocket; エラーイベント: TErrorEvent;
varErrorCode: 整数);
プライベート
{プライベート宣言}
公共
{公的宣言}
終わり;
変数
フォーム1: TForm1;
実装
{$R *.dfm}
プロシージャ TForm1.ServerSocket1ClientRead(送信者: TObject;
ソケット: TCustomWinSocket);
タイプ
SendPack = パックされたレコード
ヘッド: SGIヘッド;
応答: Bind_Resp;
終わり;
変数
リヘッド:SGIPヘッド;
sresp:Bind_Resp;
リバインド:xバインド;
再配信:X配信;
レポートレポート:Xレポート;
i1、i2:整数;
文字列:文字列;
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));
if i1<>sizeof(ReHead) then
始める
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));
if i1<>sizeof(ReHead) then
memo1.Lines.Add('SGIP_UNBIND_Resp エラーを送信')
それ以外
memo1.Lines.Add('SGIP_UNBIND_Resp を送信 OK');
終わり
それ以外の場合、ReHead.CommandId=SGIP_BIND の場合
begin file://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));
if i1<>SizeOf(s_Pack) then
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 を送信 OK');
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(送信者: TObject;
ソケット: TCustomWinSocket; エラーイベント: TErrorEvent;
varErrorCode: 整数);
変数
エラーメッセージ:文字列;
始める
エラーイベントのケース
eeGeneral: errorMsg:='eeGeneral';
eeSend: errorMsg:='eeSend';
eeReceive: errorMsg:='eeReceive';
eeConnect: errorMsg:='eeConnect';
eeDisconnect: errorMsg:='eeDisconnect';
eeAccept: errorMsg:='eeAccept';
終わり;
エラーコード:=0;
Memo1.Lines.Add('ソケット エラー:'+errorMsg);
終わり;
終わり。