2

我最近开始在 PHP 上练习套接字,但遇到了一个我找不到文档的问题。我在 C++ 中看到过类似的情况,但对此没有明确的答案。编码:

do {
    $input = socket_read($client, 12,PHP_BINARY_READ);
    echo $input;
} while(TRUE);

应该在套接字上阻塞(不包括用于创建、绑定等的代码)并获取 12 个字节或从另一端可用的任何信息。

奇怪的是,如果读取了 12 个字节,我只会在变量 $input 中得到一个“1”。如果我从客户端发送超过 12 个字节,那么我会在 $input 的值中收到 '1[REST_OF_DATA]'。

知道为什么会这样吗?

如果我将其更改为更多数据和 PHP_NORMAL_READ,那么我将正确接收数据。

PHP手册在线没有说任何关于socket_read返回'1'的信息。

**编辑:好的,感谢您的早期回答:)。我正在保存到文件并读取(不回显到浏览器)期望任何字符。如果有 C++ 套接字知识的人可以验证,我想我可能刚刚发现了一些可能很好的东西。无论如何,我的阅读代码实际上是这样的(不是我上面发布的):

do {
    $input = ($seq_id == 0) ? socket_read($client, 12,PHP_BINARY_READ) : socket_read($client,1024,PHP_BINARY_READ);
    echo $input;
} while(TRUE);

我期待第一次读取时有 12 个字节,然后是 1024 块,这是条件检查的原因。奇怪的'1'来自于此。如果我用我在上面发布的行替换它,则可以正常读取数据。事实上,即使是这样阅读:

$input = ($seq_ID == 0) ? socket_read($client,12,PHP_BINARY_READ) : socket_read($client, 12,PHP_BINARY_READ);

结果:第一次读取 = '1' 第二次读取 = 正确数据,第三次读取 = 正确数据..

4

2 回答 2

1

您指定的12是要读取的最大长度,因此12可以表示大小为 0-12 个字符的返回字符串(PHP 中的二进制字符串,1 char = 1 字节)。

此外,由于它可以是二进制的,我建议您使用var_dump返回字符串值的 hexdump 来实际找出返回了多少字节,echo 可能会隐藏一些控制字符,您的浏览器可能会隐藏空格。

于 2012-04-09T16:24:09.947 回答
0

对于上面的评论,是的 $seq_id 应该增加。我只是想缩短代码。所以现在,答案对我来说不再重要,但仍然是一个谜,在本月升级我的 Ubuntu 版本后,我无法使用相同的脚本复制错误:

<?php
set_time_limit(0);
$address = "192.168.1.1";
$port = 3320;
$server_users = 3; 
$mysock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not create socket\n");
$bind_result = socket_bind($mysock,$address, $port) or die("Could not bind to address\n"); 
$listen_result = socket_listen($mysock, $server_users)  or die("Could not set up socket   listener\n");
$client = socket_accept($mysock) or die("Could not accept the connection to socket\n");

$seq_id =0;
do {
$input = ($seq_id == 0) ? socket_read($client, 12,PHP_BINARY_READ) : socket_read($client,1024,PHP_BINARY_READ);
echo $input;
} while(TRUE);
?>

我在终端执行它:

$php -q myscript.php

并使用 netcat 对其进行测试:

$netcat 192.168.1.1 3320

请注意,问题是关于 socket_read 返回 1 作为结果,这在任何地方都没有记录

于 2012-04-17T22:41:46.613 回答