2013-03-28 5 views
7

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

私は自分自身でこれをやってみましたが、何らかの理由でそのだけで

 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; 

は、誰もが私が作っているものを間違いを指摘していただけますか?ありがとうございました!

+0

は、おそらくこれは完全に公共の場所で検討IPを削除したいです。 –

+0

最初のコードスニペットはCでビルドされたものです.2番目はPHPのスニペットで、stackoverflowのどこかで見つけました。 – user2073973

答えて

9

としては、クライアントが 標準ポート上のMinecraftサーバーへTCP接続を開始here

を説明しました。 authとログイン( プロトコル暗号化で詳述)の代わりに、2バイトシーケンスFE 01を送信します。これは 0xFEサーバーリストのpingパケットです。 2番目のバイト(0x01)が でない場合、サーバーは約1000ms待機してから、サーバー - > 1.3以降で使用されるクライアント形式で応答します。あなたはUDPパケットを送信しているのに対し、TCP要求を送信する必要があり

...

+0

minecraftはUDPプロトコルを使用しているため、パケット。ありがとうございました! – user2073973

+0

ニースは今働いています! – user2073973

+0

@ user2073973問題が解決したら、回答を受け入れるのがいい形です。 – Yaur