Telnet соединение и проблема при отправке ввода на сервер - PullRequest
1 голос
/ 05 июля 2010

Я написал серверную программу, используя select. Затем я подключил клиента с помощью telnet. Соединение также успешно установлено.

Если у меня длина ввода равна 6 символам, включая перевод строки, на стороне сервера она будет отображать длину как 7 символов Как это возможно?

1 Ответ

1 голос
/ 05 июля 2010

Сторона сервера:

Клиент отправляет \r\n вместо \n, что будет учитывать дополнительный символ.Вы можете перевести его обратно на новую строку с простым регулярным выражением:

# $data holds the input line from the client.
$data =~ s/\r\n/\n/g;  # Search for \r\n, replace it with \n

На стороне клиента:

Предполагается, что вы используете Net :: Telnet, вы, вероятно, отправляете 2 символа для новой строки, \r и \n, как указано в Telnet RFC .

Документация, с которой я связан, говорит об этом,

Во входном потоке каждая последовательность возврата каретки и перевода строки (то есть "\ 015 \ 012" или CR LF) преобразуется в "\ n".В выходном потоке каждое вхождение "\ n" преобразуется в последовательность CR LF.Смотрите binmode (), чтобы изменить поведение.Протоколы TCP обычно используют последовательность ASCII, возврат каретки и перевод строки для обозначения новой строки.

И по умолчанию это не двоичный режим (binmode), что означает, что все экземпляры \n в ваших клиентских данныхбудет заменен на \r\n перед отправкой на сервер.

По умолчанию Binmode равен 0, что означает перевод новой строки.

Вы можете остановить модульот замены ваших новых строк вызовом binmode в вашем файловом дескрипторе, или в случае Net :: Telnet, вызовите binmode для вашего объекта и передайте 1.

# Do not translate newlines.
$obj->binmode(1);

Или на сервере вы можетенайдите \r\n во входных данных и замените его на \n.

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