8

PHPでMinecraftサーバーにpingできるようにするこの小さなコードスニペットを見つけましたが、今はC#でこれを行いたいです。

自力でやってみたけどなぜかうまくいかない

        UdpClient client = new UdpClient();
        IPEndPoint ep;
        try
        {
            ep = new IPEndPoint(IPAddress.Parse("-snip-"), -snip-);
            client.Connect(ep);
        }
        catch { Console.WriteLine("Error"); Console.ReadLine(); return; }
        byte[] bytes = new byte[1];
        bytes[0] = (byte)0xFE;
        client.Send(bytes, bytes.Length);
        IPEndPoint rep = new IPEndPoint(IPAddress.Any, 0);
        byte[] recv = client.Receive(ref rep);
        Console.WriteLine(ASCIIEncoding.ASCII.GetString(recv));
        Console.ReadLine();

サーバーはパケットを完全に無視しているようです。これは私が見つけたコードスニペットです:

    $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;

誰かが私が犯している間違いを指摘してもらえますか? ありがとうございました!

4

1 に答える 1

10

ここに記載されているように

クライアントは、標準ポートで minecraft サーバーへのTCP接続を開始します。認証とログインを行う代わりに (プロトコルの暗号化で詳述)、2 バイト シーケンス FE 01 を送信します。これは 0xFE サーバー リスト ping パケットです。2 番目のバイト (0x01) が欠落している場合、サーバーは約 1000 ミリ秒待機してから、1.3 以前で使用されていたサーバー -> クライアント形式で応答します。

UDPパケットを送信しているときにTCPリクエストを送信する必要があります...

于 2013-03-28T22:58:32.800 に答える