2013-03-28 51 views
7

所以找到了這個小代碼片段,它可以讓你在PHP中ping一個Minecraft服務器,但是現在我想在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#中構建的,第二個是PHP中的代碼片段,我在這裏找到了stackoverflow – user2073973

回答

9

如上所述here

客戶機啓動的 標準端口上的TCP連接到的Minecraft服務器。它不是進行身份驗證和登錄(詳見 協議加密),而是發送兩個字節序列FE 01.這是一個 0xFE服務器列表ping數據包。如果第二個字節(0x01)缺失 ,則服務器等待約1000ms,然後使用1.3和更低版本中使用的服務器 - > 客戶端格式進行答覆。

你需要發送一個TCP請求,而你發送一個UDP包...

+0

哦哇,我想因爲minecraft使用UDP協議,它也會使用UDP協議進行ping包。謝謝! – user2073973

+0

現在不錯! – user2073973

+0

@ user2073973好的形式是接受一個答案,如果它解決了你的問題。 – Yaur