* 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;
}?>