我需要将在 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