我最近开始在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”第二次读取=正确数据,第三次读取=正确数据..
答案 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,这在任何地方都没有记录