Программирование сокетов - Отправка / получение гекса и строк - PullRequest
0 голосов
/ 27 октября 2010

У меня есть следующий код на 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());

На самом деле, я не могу понять, как перенести это в ruby.Любая помощь здесь?

Это то, что у меня пока, но это не работает, как ожидалось:

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 голосов
/ 03 ноября 2010

Здесь следует рассмотреть как минимум две вещи:

  1. Порядок байтов в сети - big-endian. Это означает, что вы всегда должны думать в единичных байтах или массивах байтов, поскольку байты не подлежат перемешиванию, в то время как более крупные типы.
  2. C # BitConverter.GetBytes (int16) возвращает 2 байта в формате с прямым порядком байтов , а GetBytes (int32) возвращает 4 байта в формате с прямым порядком байтов

Не зная ни одного Ruby или его строкового формата, я думаю, вам нужно сделать что-то подобное для первой части:

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

Вторая часть должна быть в порядке.

WireShark - неоценимый инструмент при отладке сетевого кода и / или сетевых протоколов обратного инжиниринга, записи трафика приложения C # и сравнения различий с вашим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...