加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP使用cURL ping Minecraft服务器

发布时间:2020-12-13 16:44:33 所属栏目:PHP教程 来源:网络整理
导读:Helo all, 我有一个脚本是为使用fsockopen ping一个Minecraft服务器而创建的.我想知道是否有办法将其转换为使用cURL? 这是功能: function pingserver($host,$port=25565,$timeout=30) {//Set up our socket$fp = fsockopen($host,$port,$errno,$errstr,$ti
Helo all,
我有一个脚本是为使用fsockopen ping一个Minecraft服务器而创建的.我想知道是否有办法将其转换为使用cURL?

这是功能:

function pingserver($host,$port=25565,$timeout=30) {
//Set up our socket
$fp = fsockopen($host,$port,$errno,$errstr,$timeout);
if (!$fp) return false;

//Send 0xFE: Server list ping
fwrite($fp,"xFE");

//Read as much data as we can (max packet size: 241 bytes)
$d = fread($fp,256);

//Check we've got a 0xFF Disconnect
if ($d[0] != "xFF") return false;

//Remove the packet ident (0xFF) and the short containing the length of the string
$d = substr($d,3);

//Decode UCS-2 string
$d = mb_convert_encoding($d,'auto','UCS-2');

//Split into array
$d = explode("xA7",$d);

//Return an associative array of values
return array(
    'motd'        =>        $d[0],'players'     => intval($d[1]),'max_players' => intval($d[2]));
}

似乎此功能仅在本地服务器上运行时才有效,这就是我想将其转换为cURL的原因,以便我可以在远程服务器上运行它.

解决方法

我意识到你已经解决了你的问题,但我也需要一个命令行Minecraft’ping’,所以我将你的PHP代码移植到一个独立的Perl脚本,并认为我会在这里分享它以防其他人需要类似的东西.该脚本仅使用核心模块,因此它应该在您安装Perl的任何位置工作.

#!/usr/bin/perl
##############################################################################
#
# Script:   mcping
#
# Author:   Grant McLean <grant@mclean.net.nz>
#
# Description:
#
# 'ping' a minecraft server to check it's alive
#

use strict;
use warnings;

use IO::Socket;
use Pod::Usage;
use Getopt::Long  qw(GetOptions);
use Encode        qw(decode);
use Time::HiRes   qw(gettimeofday tv_interval);

my(%opt);

if(!GetOptions(%opt,'help|?')) {
    pod2usage(-exitval => 1,-verbose => 0);
}

pod2usage(-exitstatus => 0,-verbose => 2) if $opt{help};

my $target = shift or pod2usage(
    -exitval => 1,-verbose => 0,-message => 'No host specified'
);

my $port = 25565;
if($target =~ /(.*?):(d+)$/) {
    $target = $1;
    $port   = $2;
}

ping_server($target,$port);

exit 0;


sub ping_server {
    my($host,$port) = @_;

    my $t0 = [gettimeofday];
    my $s = IO::Socket->new(
        Domain   => AF_INET,PeerAddr => $host,PeerPort => $port,Proto    => 'tcp',) || die "$!n";

    $s->autoflush(1);
    print $s "xFE";

    sysread($s,my $resp,256);
    my $elapsed = tv_interval($t0);

    die "Malformed response after connectn" unless $resp =~ /^xFF/;

    substr($resp,3,'');

    $resp = decode('UCS-2',$resp);

    my($motd,$players,$max_players) = split /x{A7}/,$resp;

    print "Msg of the Day:  $motdn"
        . "Players Online:  $playersn"
        . "Max Players:     $max_playersn";
    printf "Ping Time:       %5.3fsn",$elapsed;
}


__END__

=head1 NAME

mcping - 'ping' a minecraft server

=head1 SYNOPSIS

  mcping [options] host-or-ip:port

  Options:

   -?     more detailed help message

=head1 DESCRIPTION

Attempts to connect to a minecraft server on the specified host:port.  On
success,a brief report like this will be printed:

  Msg of the Day:  A Minecraft Server
  Players Online:  2
  Max Players:     10
  Ping Time:       0.175s

If the :port is not specified,the default port number of 25565 will be used.

=head1 OPTIONS

=over 4

=item B<-?>

Display this documentation.

=back

=head1 AUTHOR & COPYRIGHT

This script was written by Grant McLean ( grant@mclean.net.nz ) as a Perl port
of a similar PHP script here: https://stackoverflow.com/questions/10055839/

This script may be freely used,copied and distributed under the same terms as
Perl itself.

=cut

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读