c++またはdelphi(この2つの例があります)で行われたソケットTCP/IP通信の例をPHPに書き直す必要がありますが、関数memcpy(c++)/move(delphi)と両方の言語で使用される構造に問題があります。
どちらの場合も、次の 2 つの構造があります: (デルファイの構造体)
SPMSifHdr = packed record
ui32Synch1: Longword;
ui32Synch2: Longword;
ui16Version: Word;
ui32Cmd: Longint;
ui32BodySize: Longint;
end;
SPMSifRegisterMsg = packed record
hdr1: SPMSifHdr;
szLicense: Array[0..19] of char;
szApplName: Array[0..19] of char;
nRet: Longint;
end;
メッセージをサーバーに送信するために使用されるコード:
procedure TForm1.btnRegisterClick(Sender: TObject);
var
RegMsg: SPMSifRegisterMsg;
byteMsg: Array[0..(sizeof(SPMSifRegisterMsg) - 1)] of byte;
begin
FillChar(RegMsg, SizeOf(RegMsg), 0);
SetHeader(CMD_REGISTER, RegMsg.hdr1); //Set header information
StrPCopy(RegMsg.szLicense, LicEdit.Text); //build data to structure
StrPCopy(RegMsg.szApplName, ApplEdit.Text);
Move(RegMsg, byteMsg, sizeof(SPMSifRegisterMsg)); //copy structure to bytearray
ClientSocket1.Socket.SendBuf(byteMsg, sizeof(SPMSifRegisterMsg)); //send the data
end;
問題:
1º - PHP で最初に、C++ や Delphi で使用されているような 1 つの構造をどのように表すことができますか?
注: この種の構造体を socket_send メソッドの 'buf' パラメータに渡す必要があることを覚えておいてください)
2º - PHP で、memcpy(c++)/move(delphi) のように同じ仕事をする関数は?
注: 私にとっては、必要な情報をメモリ ブロックに直接送信することは重要ではありませんが、C++ や Delphi で発生するように、情報を 16 進数 (?) に変換することは重要です。
memcpy の前の情報を含む構造:
サーバーに送信された memcpy 関数/情報の結果:
私はこの状況に必死です.2番目の問題については、関数「pack()」を使用してみましたが、受信する必要がある形式がわからないため、使用する形式がわかりません.
必要に応じて、より多くの情報を提供できます。
アップデート:
C++ や Delphi で行ったのと同じ仕事を PHP で行う正しい方法は、次の方法からだと思います。
$packed = pack('N', "1431655765") //HEADER - uint32 ui32Synch1
. pack('N', "2863311530") //HEADER - uint32 ui32Synch2
. pack('n', 1) //HEADER - uint16 ui16Version
. pack('N', 1) //HEADER - uint32 ui32Cmd;
. pack('N', "44") //HEADER - uint32 ui32BodySize
. pack('C', "44436412") . pack('N', " ") //BODY - char szLisence[20]
. pack('C', "Test_Program") . pack('N', " ") //BODY - char szApplName[20]
. pack('I', 0); //BODY - int nRet
しかし、なぜこの種の通信をデバッグするのかがわからないため、よくわかりません。この方法で情報を送信すると:
socket_send ( $sock , $message , 62, 0)
ロード時にスクリプト/ページがタイムアウトするまでフリーズし、サーバーから何のメッセージも受信しません。
これが PHP で通信する正しい方法かどうか誰か教えてくれませんか? または、私が示した C++ または Delphi のコードを書き直す他の方法はありますか?
解決済み:
いくつかの経験の後、私はこれだけで状況を解決します:
$message = pack('N', 1431655765) //HEADER - uint32 ui32Synch1
. pack('N', 2863311530) //HEADER - uint32 ui32Synch1
. pack('v', 1) //HEADER - uint16 ui16Version
. pack('V', 1) //HEADER - uint32 ui32Cmd;
. pack('V', 44) //HEADER - uint32 ui32BodySize
. pack('a20', "44436412") //BODY - char szLisence[20]
. pack('a20', "Test_Program") //BODY - char szApplName[20]
. pack('I', 0); //BODY - int nRet