我正在嘗試使用數據包在c#中創建Minecraft假客戶端a.k.a Minecraft chatbot。 我已經嘗試了很多不同的方式來實現這一點,但沒有運氣。爲什麼數據包發送不發送數據(與Minecraft服務器握手)?
每次我發送一個數據包,它都不發送數據(使用packetsniffer)。 雖然packetsniffer說,數據包的總大小是:190個字節。 ,大小爲:17字節。
這裏是我的代碼:
static TcpClient client = new TcpClient();
static void Main(string[] args)
{
Console.WriteLine("Start GATHERING INFO.....");
Console.Write("Write a ip: ");
IPAddress ip = IPAddress.Parse("192.168.178.11");
try
{
ip = IPAddress.Parse(Console.ReadLine());
}
catch
{
Console.Write("\nUnknown/Wrong ip entered redirecting to : 127.0.0.1 (AKA Localhost)");
ip = IPAddress.Parse("192.168.178.11");
}
Console.Write("\nWrite a port: ");
int port = int.Parse(Console.ReadLine());
Console.WriteLine("Connecting.....");
try
{
client.Connect(ip, port);
client.NoDelay = false;
Console.WriteLine("Connection succesfull!");
}catch
{
Console.WriteLine("--== ERROR WHILE TRYING TO CONNECT PLEASE RESTART PROGRAM ==--");
Console.ReadKey();
client.Close();
Main(args);
}
Stream stream = client.GetStream();
Console.Write("Please enter a username: ");
string usrn = Console.ReadLine();
Console.Write("\n");
byte[] data = new byte[3 + usrn.Length*2];
data[0] = (byte)2;
data[1] = (byte)29;
gb(usrn).CopyTo(data, 2);
stream.Write(data, 0, data.Length);
Console.ReadKey();
}
public static byte[] gb(String str)
{
return System.Text.ASCIIEncoding.ASCII.GetBytes(str);
}
下面是數據包應該如何看起來像:
http://www.wiki.vg/Protocol#Handshake_.280x02.29
我忽略了,因爲其他的機器人沒有使用它的服務器主機和服務器端口。 (雖然他們沒有工作:/
這裏是原來的客戶端數據包會怎樣:
'顯示怪異轉到:https://dl.dropbox.com/u/32828727/packetsocketsminecraft.txt'
timboiscool9(我的用戶名) 192.168.178.1(服務器IP)
還有更多之後,但是這是我需要的。
我是相當新的插座和tcpclients
這裏有很多奇怪的事情發生。你爲什麼要調用'Main(args)'而不使用'while'循環?你不需要第一次解析ip,因爲你會直接在'try'中覆蓋它。爲了提高可讀性,使用比'gb'更多的描述性方法名稱。 C#可以處理更長的方法名稱(同樣適用於變量名稱)! – Default
失敗後我該如何回到起點?因爲一段時間循環,它只會繼續。 (也許是goto?) –
你是什麼意思,它會繼續?在條件錯誤之前它不會繼續。你可以做'while(!done)'並設置'done = true;'當client.Connect'成功時 – Default