【发布时间】:2012-09-24 09:55:58
【问题描述】:
我正在尝试使用数据包在 c# 中制作一个 Minecraft 假客户端,即 Minecraft 聊天机器人。 我已经尝试了很多不同的方法来实现这一点,但没有运气。
每次我发送数据包时,它都不会发送数据(使用数据包嗅探器)。 虽然数据包嗅探器说数据包的总大小是: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
我忽略了服务器主机和服务器端口,因为其他机器人没有使用它。 (虽然他们没有工作:/
这是原始客户端数据包的内容:
'显示奇怪的 goto:https://dl.dropbox.com/u/32828727/packetsocketsminecraft.txt'
timboiscool9(我的用户名) 192.168.178.1(服务器ip)
之后还有更多,但这正是我需要的。
我对套接字和 tcpclients 还很陌生
【问题讨论】:
-
这里发生了很多奇怪的事情。你为什么打电话给
Main(args)而不是使用while循环?你不需要第一次解析ip,因为你会直接在try中覆盖它。为了提高可读性,请使用比gb更具描述性的方法名称。 C# 可以处理更长的方法名(变量名也是如此)! -
失败后如何回到起点?因为有一个while循环它会继续。 (也许是转到?)
-
你的意思是它会继续吗?在条件为假之前它不会继续。当
client.Connect成功时,你可以做while (!done)并设置done = true; -
@default 哈哈确实是我的错。但回到主题?
标签: c# sockets packet minecraft