【问题标题】:How to write byte by byte to socket in PHP?如何在 PHP 中逐字节写入套接字?
【发布时间】:2011-01-29 05:09:03
【问题描述】:

如何在 PHP 中逐字节写入套接字?

例如,我该怎么做:

socket_write($socket,$msg.14.56.255.11.7.89.152,strlen($msg)+7);

伪代码连接的数字实际上是 dec 中的字节。希望你能理解我。

【问题讨论】:

  • 你到底为什么要一个字节一个字节地做呢?
  • 你不能只写一个字节数组吗?
  • 好的,没错。但是如何写一个字节数组呢? :)

标签: php sockets byte raw-sockets


【解决方案1】:

您可以使用pack 函数将数据打包成您希望的任何数据类型。然后将其与任何socket 函数一起发送。

$strLen = strlen($msg);

$packet = pack("a{$strLen}C7", $msg, 14, 56, 255, 11, 7, 89, 152);

$pckLen = strlen($packet);

socket_write($socket, $packet, $pckLen);

【讨论】:

  • 谁反对每个人的回答?这真的是很糟糕的形式。
  • 谢谢马克。这个功能对我来说很陌生。这是非常有用的解决方案。而且看起来很安全——在另一边有解包功能:)
  • Pack 对我来说就像一个隐藏的功能,但一旦你找到它,它就是一个宝石。
【解决方案2】:

根据http://www.php.net/manual/en/function.socket-create.php#90573

你应该可以的

socket_write($socket,"$msg\x14\x56\x255\x11\x7\x89\x152",strlen($msg)+7);

【讨论】:

  • 问题中的值是“bytes in dec”(十进制)。 \x### 格式是十六进制值,所以这会给出错误的结果。
  • 谢谢凯文和厄尔兹。你认为这个解决方案会是 PHP6 安全的吗?我现在可以看到它们终于在简单的 ascii 字符串之上移动了。
  • 所以只需将十进制值转换为十六进制。无论如何,大多数东西在十六进制中更具可读性
  • 根据php.net/manual/en/…,除了十六进制或八进制外,您不能插入原始值,所以请自行选择。
【解决方案3】:

在 PHP 6 之前,字节只是字符。写出一个字符串与写一个字节数组是一样的。如果这些是 ascii 字符十进制值,您可以将 $msg... 位替换为:

$msg.chr(14).chr(56).chr(255).chr(11).chr(7).chr(89).chr(152)

如果您能解释您正在尝试做什么,我们将更容易提供更有帮助的答案,但同时完成您到目前为止所描述的内容。

【讨论】:

  • 安全是什么意思? PHP 6 引入了 unicode,这意味着它将不再是 1 字节 = 1 个字符。 (一些)各种字符串函数的参数和返回值会改变,你的代码也必须相应地更新。函数的在线文档描述了这些变化。
  • 是的,你是对的。我同意。使用 utf8 不应该受到 byte->char 转换的影响,只要我们能够在套接字的另一侧将它作为字节读取。但是将 utf8 字符串拆分回字节的“字节安全”方式究竟是怎样的呢?他们将添加函数 subbyte :) 这将允许我们遍历字节而不是字符或什么? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 2015-08-28
  • 2023-03-17
  • 2012-05-18
  • 1970-01-01
相关资源
最近更新 更多