Как отправить один байтовый символ в серверный сокет с помощью netcat?

Уже есть работающая серверная служба через сокет, и я хотел бы протестировать ее через netcat. Я использую Mac OS X Lion. В настоящее время я могу подключиться к серверу через порт, чтобы отправить пакет, но пакет содержит неправильное значение. Вот подробности:

Мне нужно отправить символ «m» на сервер, и сервер вернет 00000000, нулевой байт в качестве ответа. Парень с сервером сказал мне, что сервер получает «A0», когда я отправляю «m», и сервер получает «313039A», когда я отправляю «109». Как определить формат отправки или что-то в этом роде, мне просто нужно отправить 'm' (01101101)?


person Centurion    schedule 07.02.2012    source источник
comment
Не знаю насчет A0, но в ASCII 109 это 0x31 0x30 0x39.   -  person cnicutar    schedule 07.02.2012


Ответы (1)


Вы можете отправить только "м" с

echo -n 'm' | nc <server> <port>

Вы можете легко проверить, что вы отправляете на своем локальном компьютере:

# in one Terminal start the listener:
$ nc -l 1234 | hexdump -C
00000000  6d                                                |m|
00000001

# in other Terminal send the packet:
$ echo -n 'm' | nc 127.0.0.1 1234

nc с радостью отправит/получит NUL-байты — с этим проблем нет:

# sending side
$ echo -n X | tr X '\000' | nc 127.0.0.1 1234

# receiving side
$ nc -l 1234 | hexdump -C
00000000  00                                                |.|
00000001
person Simon Urbanek    schedule 07.02.2012
comment
Большое спасибо. Однако сервер не отвечает, когда я отправляю только «m» через nc. Это происходит, когда я отправляю сформированный вручную пакет из своей программы (objective-c). Кроме того, что в примере означают 00000000 и 00000001? Я предполагаю, что «6d» — это «m», но что означают другие значения? ИМХО, он отправляет 3 байта: нулевой байт, значение «m» и размер пакета. - person Centurion; 07.02.2012
comment
Но мне нужно отправить только 1 байт: просто значение «m» (01101101). Так реализован сервер. Это пакет рукопожатия. - person Centurion; 07.02.2012
comment
Нет, 000000 - это адрес, основанный на 0, поэтому он говорит, что есть только один единственный байт 0x6d, который точно равен «m». - person Simon Urbanek; 08.02.2012
comment
ХОРОШО. На самом деле сервер отправляет нулевой байт в качестве ответа после получения рукопожатия 'm'. Может быть, все в порядке, и я отправляю 'm' на сервер, но, возможно, netcat не отображает нулевой байт. После этой операции соединение установлено, и я могу отправлять другие пакеты и видеть их результаты, но не знаю, как вводить точные байты при повторном запросе. После echo..nc курсор стоит в пустой новой строке и ИМХО все введенные символы интерпретируются как символы ASCII, а не байты. - person Centurion; 08.02.2012
comment
netcat с радостью получит символ NUL и передаст его дальше — я обновил ответ выводом, чтобы продемонстрировать, что - person Simon Urbanek; 09.02.2012