如何使用 PHP 将字节流发送到套接字?
How do i send a byte stream to a socket with PHP?
在 GO 中我可以执行以下操作:
conn, _ := net.Dial("tcp", CONNECT) // Client
request := []byte{01, 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 但没有成功,服务器无法识别我的输入。
在您的 Go 示例中,您的请求以字节 0x01
和 0x00
开头。在 PHP 中,您正在编写字符串 '0100'
的字节编码。它们并不完全相同,您可以在此处查看它们的不同之处:https://play.golang.org/p/0gidDZe4lZF
您真正想要写的是字符串开头的单字节 0x0 和 0x1,而不是这些字符。
使用 PHP 的内置 chr function 我们可以使用单个字节 0x0 和 0x1 创建一个字符串,如下所示:
$queryString = chr(0) . chr(1);
$queryString .= '09302020073014323720200730007402'
排除 PHP 方面的任何其他编码问题,这应该与您在 Go 示例中的查询匹配。
在 GO 中我可以执行以下操作:
conn, _ := net.Dial("tcp", CONNECT) // Client
request := []byte{01, 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 但没有成功,服务器无法识别我的输入。
在您的 Go 示例中,您的请求以字节 0x01
和 0x00
开头。在 PHP 中,您正在编写字符串 '0100'
的字节编码。它们并不完全相同,您可以在此处查看它们的不同之处:https://play.golang.org/p/0gidDZe4lZF
您真正想要写的是字符串开头的单字节 0x0 和 0x1,而不是这些字符。
使用 PHP 的内置 chr function 我们可以使用单个字节 0x0 和 0x1 创建一个字符串,如下所示:
$queryString = chr(0) . chr(1);
$queryString .= '09302020073014323720200730007402'
排除 PHP 方面的任何其他编码问题,这应该与您在 Go 示例中的查询匹配。