0

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
4

0 に答える 0