php socket read 乱码,php socket编程:使用socket_recv而不是socket_read

这是一个关于使用PHP实现的Socket服务器,采用同步阻塞IO模型,处理固定长度的数据包。测试中,当客户端进程被kill后,服务器无法通过socket_last_error()准确判断连接是否已断开,导致可能的错误处理。代码展示了如何进行连接监听、读取客户端数据以及异常处理。
摘要由CSDN通过智能技术生成

* file: bug1_server.php

* socket server

* 基于php socket函数族

* IO模型:同步阻塞

* 粘包处理:固定长度

* 连接数:1个socket连接

*

* 测试目标:模拟client crash时,server无法判断socket是否断开

* 测试结果:kill杀掉client进程后,server进程socket_last_error()返回为0,无法判断socket是否关闭

*

* @author davidyanxw

* @date 2018.04.27*/set_time_limit(0);//创建服务端的socket套接流,net协议为IPv4,protocol协议为TCP

$socket =socket_create(AF_INET, SOCK_STREAM, SOL_TCP);//reuse address

socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);/*绑定接收的套接流主机和端口,与客户端相对应*/

if (socket_bind($socket, '127.0.0.1', 8801) == false) {

echo'server bind fail:'. socket_strerror(socket_last_error());

}//监听套接流

if (socket_listen($socket, 4) == false) {

echo'server listen fail:'. socket_strerror(socket_last_error());

}

$accept_resource=socket_accept($socket);if($accept_resource === false) {

echo"accept connection failed".PHP_EOL;

exit;

}//读写超时时间:0.8s

socket_set_option($accept_resource, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 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*/

functionrandomkeys($length){

$output='';for ($a = 0; $a

$output .= chr(mt_rand(33, 126));

}return$output;

}?>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值