套接字编程 - 发送/接收十六进制和字符串

时间:2010-10-27 04:40:42

标签: c# ruby sockets

我在C#中有以下代码:

Console.WriteLine("Connecting to server...");
TcpClient client = new TcpClient("127.0.0.1", 25565);
client.Client.Send(BitConverter.GetBytes(0x02));
client.Client.Send(BitConverter.GetBytes(0x0005));
client.Client.Send(Encoding.UTF8.GetBytes("wedtm"));
Console.Write("{0:x2}", client.GetStream().ReadByte());

对于我的生活,我无法弄清楚如何将其转换为红宝石。这里有什么帮助吗?

这是我到目前为止所做的,但它没有按预期工作:

require 'socket'
s = TCPSocket.open("127.0.0.1", 25565)
s.write(0x02)
s.write(0x0005)
s.write("wedtm".bytes)
response = s.recvfrom(2)
puts "Response Size #{response.size}: #{response.to_s}"

响应应为0x02

编辑:

我假设我必须在此使用String#unpack,但是,我无法弄清楚如何让“wedtm”输出到适当的\x000\x000\x000\x000格式。

1 个答案:

答案 0 :(得分:0)

这里至少要考虑两件事:

  1. 网络字节顺序是big-endian。这意味着您应该始终考虑单个字节或字节数组,因为字节不会在较大类型的情况下被洗牌。
  2. C#的BitConverter.GetBytes(int16)返回2 bytes in little-endian format而GetBytes(int32)返回4 bytes in little-endian format
  3. 在不知道任何Ruby或其字符串格式的情况下,我猜你需要为第一部分做这样的事情:

    s.write("\x02\x00".bytes)
    s.write("\x05\x00\x00\x00".bytes)
    

    第二部分应该没问题。

    在调试网络代码和/或逆向工程网络协议时,

    WireShark是一个非常宝贵的工具,记录C#应用程序的流量并比较与您的差异。