2013-03-28 33 views
7

Vì vậy, tìm thấy đoạn mã nhỏ này sẽ cho phép bạn ping một máy chủ Minecraft trong PHP, nhưng bây giờ tôi muốn làm điều này trong C#.C# ping minecraft

Tôi đã cố gắng làm điều này một mình nhưng vì một lý do chỉ nó không làm việ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(); 

Máy chủ dường như chỉ hoàn toàn bỏ qua các gói tin. Đây là đoạn mã tôi đã tìm thấy:

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

Có ai vui lòng chỉ ra những sai lầm tôi đang thực hiện? Cảm ơn bạn!

+0

thể bạn muốn loại bỏ các IP coi đây là một nơi hoàn toàn công cộng. –

+0

Đoạn mã đầu tiên là những gì tôi xây dựng trong C#, đoạn thứ hai là đoạn mã trong PHP mà tôi tìm thấy ở đâu đó trên stackoverflow – user2073973

Trả lời

9

Như đã trình bày here

Client khởi tạo một kết nốiTCP đến máy chủ minecraft trên cổng tiêu chuẩn . Thay vì thực hiện auth và đăng nhập (như được nêu chi tiết trong Protocol Encryption), nó sẽ gửi chuỗi hai byte FE 01. Đây là gói tin ping danh sách máy chủ0xFE. Nếu byte thứ hai (0x01) bị thiếu , máy chủ đợi khoảng 1000ms rồi trả lời bằng Máy chủ -> Định dạng ứng dụng được sử dụng trong phiên bản 1.3 trở về trước.

bạn cần phải gửi một yêu cầu TCP trong khi bạn đang gửi một gói tin UDP ...

+0

Oh wow, tôi figured kể từ minecraft sử dụng giao thức UDP, nó cũng sẽ sử dụng giao thức UDP cho ping gói. Cảm ơn bạn! – user2073973

+0

Rất vui khi làm việc ngay bây giờ! – user2073973

+0

@ user2073973 Hình thức tốt là chấp nhận câu trả lời nếu nó giải quyết được vấn đề của bạn. – Yaur