socketsetoption php,php socket_select 为什么只能被检测到一次可读??

php socket_select 为什么只能被检测到一次可读??

有如下代码:

server.php(问题包含在代码块里了,麻烦看下,谢谢):

$ip = '127.0.0.1';

$port = 9101;

$res = socket_create(AF_INET , SOCK_STREAM , SOL_TCP);

socket_bind($res , $ip , $port);

socket_listen($res);

socket_set_option($res , SOL_SOCKET , SO_REUSEADDR , true);

$read = [];

$write = [];

$except = [];

socket_set_nonblock($res);

$count = 1;

while (true)

{

$identifier = socket_accept($res);

$read[] = $res;

if (is_resource($identifier)) {

$read[] = $identifier;

$write[] = $identifier;

}

// select 监测哪些套接字资源可读 或 可写

// 这边很奇怪的是:

// 一个client.php链接后,每个一定时间向服务器写入数据 + 读取服务端响应

// 结果这边只能检测出一次 `client.php` 写入的数据,其后一直未不可读!

// 却一直可收到服务端写入的数据

// 这是为什么??

socket_select($read , $write , $except , 0);

foreach ($read as $v)

{

$msg = socket_read($v , 1024);

echo '客户端发送数据:' . $msg . PHP_EOL;

}

foreach ($write as $v)

{

socket_write($v , 'service reponse');

}

echo '循环次数' . $count++ . PHP_EOL;

sleep(2);

}

client.php:

$ip = '127.0.0.1';

$port = 9101;

$res = socket_create(AF_INET , SOCK_STREAM , SOL_TCP);

$connect = socket_connect($res , $ip , $port);

if (!$connect) {

exit('链接失败,失败信息:' . socket_strerror(socket_last_error()) . PHP_EOL);

}

$count = 1;

while (true)

{

$buffer = 'client 2 data';

socket_write($res , $buffer);

$msg = socket_read($res , 1024);

if (!empty($msg)) {

echo '服务端响应数据:' . $msg . PHP_EOL;

}

sleep(4);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值