如何使用 PHP 将字节流发送到套接字?

Posted

技术标签:

【中文标题】如何使用 PHP 将字节流发送到套接字?【英文标题】:How do i send a byte stream to a socket with PHP? 【发布时间】:2020-11-20 16:37:47 【问题描述】:

在 GO 中我可以执行以下操作:

conn, _ := net.Dial("tcp", CONNECT) // Client

request := []byte01, 00 // The request start with 0100

request = append(request, []byte(`09302020073014323720200730007402`)...) // The request

conn.Write(request)

这确实有效,但是我无法将其转换为 php

到目前为止我有什么:

$fp = stream_socket_client("tcp://x:x", $errno, $errstr, 5);
  if (!$fp) 
      echo "$errstr ($errno)<br />\n";
   else 
      $queryString = '010009302020073014323720200730007402';
    
      fwrite($fp, $queryString);
      echo fgets($fp, $responseSize);
      fclose($fp);
  
    

我尝试使用所描述的解决方案here 没有成功,服务器无法识别我的输入。

【问题讨论】:

能否查看fwrite的返回值,看看是否真的写成功了?此外,您的查询字符串很可能被序列化为字符串而不是二进制,因此无法将第一个字符识别为字节 []byte01, 00 @JohnOss 嘿,约翰!写入成功,为简洁起见,我从代码中剥离了错误处理 程序将不同的数据写入连接。 Go 程序以 0、1 两个字节开始。PHP 程序以 48、49、49、49 四个字节开始。其余数据相同。 【参考方案1】:

在您的 Go 示例中,您的请求以字节 0x010x00 开头。在 PHP 中,您正在编写字符串 '0100' 的字节编码。这些并不完全相同,您可以在此处查看它们的不同之处:https://play.golang.org/p/0gidDZe4lZF

您真正想要写的是字符串开头的单字节 0x0 和 0x1,而不是这些字符。

使用 PHP 的内置 chr function 我们可以使用单个字节 0x0 和 0x1 创建一个字符串,如下所示:

$queryString = chr(0) . chr(1);
$queryString .= '09302020073014323720200730007402'

除了 PHP 方面的任何其他编码问题外,这应该与您在 Go 示例中的查询相匹配。

【讨论】:

以上是关于如何使用 PHP 将字节流发送到套接字?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 php 中将 Ctrl+c 发送到 telnet 套接字?

如何使用 HTTP Pipelining 通过单个 TCP 套接字发送 PHP cURL 句柄?

如何将数据发送到特定的套接字

Java中字节流如何转字符流,OutputStreamWriter用法

将字节流转换为字节数组,无需额外空间

如何将 HTTP 标头/正文与 PHP 套接字请求隔离开来