Отправка данных по TCP/IP с помощью Netcat или Rails

У меня есть IP-адрес сервера и порт, к которому я могу подключиться через nc в Ubuntu 14.04.

> nc x.x.x.x PORT

Чтобы связаться с сервером, первым шагом является отправка вызова WAKEUP и получение подтверждения. Сервер ожидает 3-байтовый идентификатор в вызове пробуждения. В документации приведен пример, демонстрирующий успешный сценарий отправки идентификатора и получения подтверждения с помощью программного обеспечения. то есть

Клиент отправляет:

<sy><sy><eq>111<et>

И сервер отвечает:

<sy><ak>A<et><cr>

Вот некоторые детали <sy>

В квадратных скобках ‹> находится непечатаемый символ ASCII (<sy> = ASCII 22 или Hex 0x16).

Я пытался воспроизвести точно такой же сценарий, но не смог. Сервер не отвечает на данные, которые я отправляю, хотя данные там принимаются. Я не уверен насчет этих тегов <sy><sy><eq> и т. д. Как правильно отправить ID(111) вместе с этими тегами <sy>?

Также пытался отправить эти данные, используя платформу Rails и рубиновый гем Bindata, но не знаю, как представить формат выше.


person Arif    schedule 13.04.2017    source источник


Ответы (1)


netcat, вероятно, не подходит для этого. Или, по крайней мере, вы захотите использовать какую-то другую программу для ввода данных.

Если бы я делал это, я бы закодировал что-то на python или C, которое одновременно подключалось бы к серверу и передавало ему любые данные, которые мне нужны для его отправки (и получения/интерпретации ответов), полностью исключая nc. В сети много примеров.

Вы можете закодировать управляющие символы в строке байтов в python с синтаксисом b'\x16' для вашего символа <sy>. Большинство других языков имеют эквивалентную возможность.

Я не могу точно сказать, что это за персонажи. Скорее всего, это стандартные управляющие символы ASCII, но в них не используются стандартные сокращения (см. http://www.theasciicode.com.ar/ например). Таким образом, предположительно документация, которую вы просматриваете, содержит список соответствующих значений. Предполагая для примера, что <eq> соответствует символу ASCII ENQ, а <et> соответствует ASCII EOT (и учитывая, что вы уже знаете, что <sy> эквивалентно ASCII SYN), желаемая строка <sy><sy><eq>111<et> может быть закодирована в строке байтов Python: b'\x16\x16\x05111\x04'

(или эквивалентно b'\x16\x16\x05\x31\x31\x31\x04', если вам нравится регулярность: символы 1 — это просто цифры ASCII, поэтому вы можете заменить каждый 1 его двоичным эквивалентом b'\x31')

Чтобы вернуться к nc, попытка ввести управляющие символы для ввода nc из окна терминала, хотя и возможна в большинстве случаев, очень сложна и подвержена ошибкам. Вам нужно будет знать эквивалентное сопоставление управляющих символов (например, 0x16 — это «Ctrl-V») и вам нужно будет знать, как заставить терминал принимать этот литеральный символ (по совпадению, в Linux вы должны предшествовать большинству управляющих символов). с помощью Ctrl-V, чтобы ввести их в качестве входных данных и избежать их обычной интерпретации: Ctrl-D == EOF, Ctrl-C == Interrupt, Ctrl-W == Delete-Previous-Word и т. д.).

Поэтому, если вы хотите ввести указанные выше данные во ввод nc из командной строки, вам нужно будет ввести следующие символы:

Ctrl-V Ctrl-V              <sy> / SYN
Ctrl-V Ctrl-V              <sy> / SYN
Ctrl-V Ctrl-E              <eq> / ENQ
1
1
1
Ctrl-V Ctrl-D              <et> / EOT

Но также важно отметить, что обычно nc на самом деле ничего не отправит, пока вы не введете новую строку (т.е. не нажмете клавишу возврата). Затем этот символ новой строки также будет отправлен на сервер, что может быть не тем, что вам нужно.

person Gil Hamilton    schedule 13.04.2017
comment
Я пытаюсь добиться этого, используя инфраструктуру Ruby on Rails и гем под названием Bindata github.com/dmendel/bindata но пока безуспешно. - person Arif; 14.04.2017