php socket编程中客户端异常关闭导致服务端中断的问题怎么解决
发表于:2024-09-24 作者:千家信息网编辑
千家信息网最后更新 2024年09月24日,这篇文章主要讲解了"php socket编程中客户端异常关闭导致服务端中断的问题怎么解决",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"php sock
千家信息网最后更新 2024年09月24日php socket编程中客户端异常关闭导致服务端中断的问题怎么解决
这篇文章主要讲解了"php socket编程中客户端异常关闭导致服务端中断的问题怎么解决",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"php socket编程中客户端异常关闭导致服务端中断的问题怎么解决"吧!
原因如下:
1.socket_recv支持多种flag,用于不同场景
2.socket_recv可以检测socket关闭的情况(例如对端关闭了socket)
返回值:$return_value=socket_recv(...)
含义: >0 表示接收到的字节数;
===0, 发生了错误,socket closed;
===false,无数据,socket not closed。
socket_read不能判断socket是否已经断开。
测试流程:
启动server端,再启动client端:可以正常通信。
kill掉client端,结果server端只能读取到空字符串。
测试代码如下:
file: bug1_server.php
0, "usec" => 800000));socket_set_option($accept_resource, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 0, "usec" => 800000));// stream固定长度$len = 100;//让服务器不停获取客户端传过来的信息while (true) { $string_read = socket_read($accept_resource, $len); if($string_read === false) { echo "socket error:" . socket_last_error() . ",error msg:" . socket_strerror(socket_last_error()) . PHP_EOL; break; } elseif($string_read == '') { if(in_array(socket_last_error(), [SOCKET_EPIPE, SOCKET_ECONNRESET])) { echo "socket error:".socket_last_error().",error msg:".socket_strerror(socket_last_error()).PHP_EOL; break; } if(in_array(socket_last_error(), [SOCKET_EAGAIN])) { // EAGAIN, retry later usleep(500); continue; } echo "server receive empty:" . socket_last_error() . ",error msg:" . socket_strerror(socket_last_error()) . PHP_EOL;}else { $string = trim($string_read); echo 'server receive success,msg:['.$string.'],time:' . microtime(true) . PHP_EOL; }} ;// 先shutdown,后close@socket_shutdown($accept_resource);socket_close($accept_resource);@socket_shutdown($socket);socket_close($socket);/** * 生成php随机串 * @param $length * @return string */function randomkeys($length){ $output=''; for ($a = 0; $a<$length; $a++) { $output .= chr(mt_rand(33, 126)); } return $output;}?>
file:bug1_client.php
0, "usec" => 800000));socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 0, "usec" => 800000));$len = 100;//连接服务端的套接流,这一步就是使客户端与服务器端的套接流建立联系if (socket_connect($socket, '127.0.0.1', 8801) == false) { echo 'connect fail massege:' . socket_strerror(socket_last_error());} else { while(1){ $ori_msg = 'Hello, server!'.randomkeys(8); $message_write = str_pad($ori_msg, $len); //向服务端写入字符串信息 $sent = @socket_write($socket, $message_write, $len); if ($sent === false) { if(in_array(socket_last_error(), [SOCKET_EPIPE, SOCKET_ECONNRESET])) { echo "socket error:".socket_last_error().",error msg:".socket_strerror(socket_last_error()).PHP_EOL; break; } echo "socket error:".socket_last_error().",error msg:".socket_strerror(socket_last_error()).PHP_EOL; } else{ echo 'client write success,msg:['.$ori_msg.'],time:' . microtime(true).PHP_EOL; }// break; }}@socket_shutdown($socket);socket_close($socket);/** * 生成php随机串 * @param $length * @return string */function randomkeys($length){ $output=''; for ($a = 0; $a<$length; $a++) { $output .= chr(mt_rand(33, 126)); } return $output;}?>
正确的代码是:(file: debug1_server.php)
0, "usec" => 800000));socket_set_option($accept_resource, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 0, "usec" => 800000));// stream固定长度$len = 100;//让服务器不停获取客户端传过来的信息while (true) { /* 使用socket_recv */ $len_read = socket_recv($accept_resource, $string_read, $len, 0); if ($len_read === false) { // no data echo "no data".PHP_EOL; continue; } elseif($len_read === 0 ) { // socket closed echo "socket error:" . socket_last_error() . ",error msg:" . socket_strerror(socket_last_error()) . PHP_EOL; break; } else { $string = trim($string_read); echo 'server receive success,msg:['.$string.'],time:' . microtime(true) . PHP_EOL; }} ;// 先shutdown,后close@socket_shutdown($accept_resource);socket_close($accept_resource);@socket_shutdown($socket);socket_close($socket);/** * 生成php随机串 * @param $length * @return string */function randomkeys($length){ $output=''; for ($a = 0; $a<$length; $a++) { $output .= chr(mt_rand(33, 126)); } return $output;}?>
感谢各位的阅读,以上就是"php socket编程中客户端异常关闭导致服务端中断的问题怎么解决"的内容了,经过本文的学习后,相信大家对php socket编程中客户端异常关闭导致服务端中断的问题怎么解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
服务
客户
客户端
问题
编程
信息
服务器
学习
生成
代码
内容
就是
情况
端的
长度
测试
不同
原因
含义
场景
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
魔兽世界怀旧盗贼宏数据库
华3网络安全工作
大数据软件开发工程师
msde数据库工具
浪潮云平台软件开发工程师
软件开发有必要考个研究生吗
数据库索引文件建立
开源多维数据库有哪些
接收服务器地址
诊所网络安全管理制度
新洲区电商网络安全维护收费标准
国产x86服务器主板
树结构数据库表设计
青海服务器维修调试费用
用友服务器连接不上
软件开发外包在哪里开发
无线网络技术锐捷实验
阿里巴巴网络服务器多少钱
vbs 处理时间数据库
自建服务器域名解析
中国网络安全报告
云计算的网络安全问题研究
云服务器租赁多少钱一个
怎么删除数据库中的一条数据
网络技术运用在那些方面
VPN服务器监控
计算机网络技术实践内容
网络技术网站设计专业
cetv家庭教育网络安全
上海数据网络技术五星服务