如何制作一个需要执行 socket_sendto 到具有以下结构的 linux C 套接字服务器的 php 套接字客户端
typedef struct
{
UI2 todo;
char rz[LNG_RZ + 1];
char saId[LNG_SAT_ID + 1];
char user[LNG_USER + 1];
char lang[LANGLEN + 1];
SI4 result;
UI4 socket;
char text[LNG_ALLG + 1];
char filename[MAX_PATHLEN];
} dmsAuf_Head;
显然,PHP 不支持 struct 如何使用 php 将 c 数据传递给套接字
我知道有一个技巧可以使用以下方法创建 c struct 对象:
class dmsAuf_Head {
public todo;
public rz
public saId
public user
public lang
public result;
public socket;
public text
public filename
}
$obj = new dmsAuf_Head();
但这不会处理属性的大小吗?有什么推荐吗?
如何在发送前序列化所有内容???
根据 c 套接字服务器的开发人员的建议,他们使用以下 c 代码将值发送到 c 套接字服务器:
rval = send(dms_aufHead->socket, (char *) dms_aufHead, sizeof(dmsAuf_Head), 0);
那么我如何使用 php 发送 dms_aufHead 数据呢?
根据 c 套接字服务器的开发人员的建议,他们使用以下 c 代码将值发送到 c 套接字服务器:
rval = send(dms_aufHead->socket, (char *) dms_aufHead, sizeof(dmsAuf_Head), 0);
那么我如何使用 php 发送 dms_aufHead 数据呢?
如果(例如)$rz 只有 3 个字符(对于这种情况)而不是所需长度的 13 个字符怎么办?我应该为 PHP 输出什么?
最佳答案
您需要以正确的顺序fwrite
数据。 pack
函数会很有用。
fwrite($sock, pack('v', 0x1234)); // send a 16 bit integer
当然,您必须注意 C 结构的构建方式(填充等)、目标机器期望的字节顺序等等。
正因为如此,对于两个系统来说,简单地按顺序读取/写入所需数据并手动(逐个字段)填充结构通常更好,而不是尝试将结构本身作为一个大文件来读取/写入堵塞。在 PHP 方面,它可能看起来像:
class dmsAuf_Head {
public $todo;
public $rz;
public $saId;
public $user;
public $lang;
public $result;
public $socket;
public $text;
public $filename;
public function send($sock)
{
fwrite($sock, pack('v', $this->todo));
// .. fwrite the rest
}
}
$foo = new dmsAuf_Head();
$foo->send($sock);
(请注意,如果您使用多个参数,您可以构建一个打包的字符串并一次性发送。)
关于php通过socket编程传递c结构数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3993762/