用PHP通过tcp读取二进制数据

时间:2013-12-19 19:38:38

标签: php sockets tcp binary

我有一个简单的服务器,通过端口上的tcp传输二进制数据(0和1) 我想使用php并读取二进制数据(位),将其存储在一个字符串中并在浏览器中显示,然后以我的方式解码。
我不想用头读取整个TCP数据包,只读数据包中的数据。

这是我在此时设法生成的代码,在浏览器中运行时,它成功连接到服务器,服务器发送数据。收到的数据,但显示在一些奇怪的俄语字母。

<?php
// host and port to connect to
$host = "127.0.0.1";
$port = 1991;

// connect to the port
$fp = fsockopen($host, $port, $errno, $errstr);

// don't die
set_time_limit(0);

// if connection not successfull, display error
if (!$fp)
{
    die("Error: Could not open socket for connection!");
}
else
{
    // connection successfull, listen for data (1024 bytes by default)
    $got = fgets($fp);

    // display the data
    echo $got;
}

fclose($fp);

?>
<br><br><br><br>
Server closed;

我想在字符串中显示收到的位。为了进一步解码,我需要8位的字节。但我不知道如何做到这一点 谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

实际上你不需要解析TCP头,因为PHP会为你做这件事。使用fgets(),您将只获得有效负载。该有效载荷由一个或几个字节组成。

为了从此有效负载的每个字节获取每个位,您必须使用bitwise operators

我建议您使用socket_read()代替fgets(),这对二进制数据不可靠:

$got = socket_read($fp, 1024);

$got包含使用此类循环可以获得的所有字节:

for ($i = 0; $i < strlen($got); ++$i)
{
    echo $got[$i]; // print one byte
}