Socket_read返回'1'..?

时间:2012-04-09 16:18:44

标签: php sockets

我最近开始在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手册在线没有说什么abou 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”第二次读取=正确数据,第三次读取=正确数据..

2 个答案:

答案 0 :(得分:1)

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

另外因为它可以是二进制的,我建议你使用var_dump和返回字符串值的hexdump来实际找出返回的字节数,echo可能会隐藏一些控制字符,浏览器可能会隐藏空格。

答案 1 :(得分: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,这在任何地方都没有记录