C# ping minecraft

8

我找到了一段代码片段,可以让你在PHP中ping一台Minecraft服务器,但现在我想在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;

请问有人能指出我的错误吗?谢谢!

(该句与IT技术无关,已按原句翻译)

可能需要删除IP地址,因为这是一个完全公开的地方。 - Kyle C
第一段代码片段是我用C#构建的,第二段是我在stackoverflow上找到的PHP片段。 - user2073973
1个回答

11

这里所述:

客户端在标准端口上向Minecraft服务器发起TCP连接。不像“协议加密”那样进行身份验证和登录,它会发送两个字节的序列FE 01。这是一种0xFE服务器列表ping数据包。如果缺少第二个字节(0x01),服务器将等待约1000毫秒,然后回复用于1.3及早期版本的“服务器->客户端”格式。

您需要发送TCP请求,而您正在发送UDP数据包...


哇,我想既然Minecraft使用UDP协议,那么ping数据包也会使用UDP协议。谢谢! - user2073973
@user2073973 好的习惯是如果答案解决了你的问题,就接受它。 - Yaur
@Yaur 是的,我尝试给你的答案点赞,但它说我需要15个声望,我对stackoverflow还比较新。现在我将你的答案标记为解决方案了。 - user2073973

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接