0

我需要将在 c++ 或 delphi 中完成的套接字 TCP/IP 通信示例(有这 2 个示例)重写为 PHP,但是函数 memcpy(c++)/move(delphi) 和两种语言中使用的结构都有问题。

在这两种情况下,我都有这两种结构:(来自 delphi 的结构)

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 中使用的结构?

注意:记住我需要在 socket_send 方法中传递这种结构,在 'buf' 参数中)

2º - 在 PHP 中,什么函数像 memcpy(c++)/move(delphi) 一样做同样的工作?

注意:对我来说,将必要的信息直接发送到内存块并不重要,但重要的是将信息转换为十六进制(?),就像在 c++ 或 delphi 中发生的那样。

在 memcpy 之前包含信息的结构:

在此处输入图像描述

memcpy 功能/信息发送到服务器的结果:

在此处输入图像描述

我对这种情况感到绝望,对于第二个问题,我尝试使用函数“pack()”,但我不知道要使用什么格式,因为我现在不知道他们需要接收什么格式。

如有必要,我可以提供更多信息。

更新:

我认为在 PHP 中用 c++ 或 delphi 完成相同工作的正确方法是这样:

$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