20,359
社区成员
发帖
与我相关
我的任务
分享
<?php
error_reporting(E_ALL);
set_time_limit(0);
ini_set("allow_call_time_pass_reference",true);
//监听端口
$PORT = 8888;
//最大连接池
$MAX_USERS = 50000;
//创建监听端口
//$sock = socket_create_listen($PORT);
$commonProtocol = getprotobyname("tcp");
$sock = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
@socket_bind($sock, '192.168.1.101', 8888);
@socket_listen($sock);
if (!$sock)
{
exit(1);
}
//不阻塞
socket_set_nonblock($sock);
$connections = array();
$input = array();
$close = array();
while (true)
{
//sleep(3);
$readfds = array_merge($connections, array($sock));
$writefds = array();
//选择一个连接,获取读、写连接通道
if (socket_select($readfds, $writefds, $e = null, $t=60))
{
foreach ($readfds as $rfd)
{
//如果是当前服务端的监听连接
if ($rfd == $sock)
{
//接受客户端连接
$newconn = socket_accept($sock);
$i = (int)$newconn;
$reject = '';
if (count($connections) >= $MAX_USERS)
{
$reject = "Server full. Try again later.\n";
}
//将当前客户端连接放如socket_select选择
$connections[$i] = $newconn;
//输入的连接资源缓存容器
$writefds[$i] = $newconn;
//连接不正常
if ($reject)
{
$close[$i] = true;
}
else
{
echo "Welcome to the PHP Chat Server!\n";
}
//初始化当前连接读取内容的缓存容器
$input[$i] = "";
continue;
}
//客户端连接
$i = (int)$rfd;
//读取
$tmp = @socket_read($rfd, 14, PHP_NORMAL_READ);
if (!$tmp)
{
//读取不到内容
print "connection closed on socket $i\n";
close($i);
continue;
}
$input[$i] .= $tmp;
$tmp = substr($input[$i], -1);
/*if ($tmp != "\r" && $tmp != "\n")
{
// no end of line, more data coming
continue;
}*/
$line = trim($input[$i]);
$input[$i] = "";
echo 'Client >>'.$line."\r\n";
$data=str_split($line);
print_r($data);
echo "\r\n";
//$data = explode("\t",$line);
//$data=str_split($data);
foreach($data as $v){
echo dechex(ord($v))."\t";
}
echo "\r\n";
socket_getpeername($connections[$i],&$remoteIP,&$remotePort);
echo $remoteIP."\r\n";
echo $remotePort."\r\n";
//$data=str_split($buffer);
//print_r($data);
$str="\xFA\x01\x01\xFF\xAA\xAA\x00\x01\x00\x00\x00\x00\x00\x01";
socket_send($connections[$i],$str,strlen($str),0);
}
foreach ($writefds as $wfd)
{
$i = (int)$wfd;
$w = socket_write($wfd, "hello");
}
}
}
function close($i)
{
global $connections, $input, $close;
socket_shutdown($connections[$i]);
socket_close($connections[$i]);
unset($connections[$i]);
unset($input[$i]);
unset($close[$i]);
}
?>
<?php
$sendStr = '30 32 30 34 03 30 33'; // 16进制数据
$sendStrArray = str_split(str_replace(' ', '', $sendStr), 2); // 将16进制数据转换成两个一组的数组
$socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname("tcp")); // 创建Socket
if (socket_connect($socket, "192.168.1.100", 8080)) { //连接
for ($j = 0; $j < count($sendStrArray); $j++) {
socket_write($socket, chr(hexdec($sendStrArray[$j]))); // 逐组数据发送
}
$receiveStr = "";
$receiveStr = socket_read($socket, 1024, PHP_BINARY_READ); // 采用2进制方式接收数据
$receiveStrHex = bin2hex($receiveStr); // 将2进制数据转换成16进制
echo "client:" . $receiveStrHex;
}
socket_close($socket); // 关闭Socket
?>
可以完美解决你的问题。。。。。。刚看见这个你的问题$s = base64_decode('+gclAvoCAAn2BCyI+gEB+v/6AQH/qqoAAQAAAAAAAfoBAf+qqgABAAAA');
print_r(unpack('H*', $s));
//或
for($i=0; $i<strlen($s); $i++) printf(' %02X', ord($s{$i}));
$str="\xFA\x01\x01\xFF\xAA\xAA\x00\x01\x00\x00\x00\x00\x00\x01";
$line = $str;
$data = str_split($line);
foreach($data as $v){
echo dechex(ord($v))."\t";
}
得到