2015-06-04 3 views
0

Я хочу, чтобы клиент telnet передавал прерывания/сигналы как их обычные значения ASCII в сообщении на сервер.telnet Подпроцесс LINEMODE TRAPSIG не работает

Отправляю следующую команду telnet от сервера к клиенту в моем коде.


IAC SB LINEMODE TRAPSIG 0 IAC SE

sprintf(msg, "%c%c%c%c%c%c%c", 255 /*IAC*/, 250 /*SB*/, 34 /*LINEMODE*/, 
2 /*TRAPSIG*/, 0 /*mask*/, 255 /*IAC*/, 240 /*SE*/); 

Но по нажатию Ctrl + C на телнет строке, клиент по-прежнему проходят телнет команды, а не значения ASCII.

Сообщение получено сервером: МВК IP- МВК DO 6 (временная метка)

Вместо того, чтобы "МВК IP" Хочу получать CTRL + C (3).

Любая идея, как я могу заставить клиента отправлять значения ASCII, а не команды telnet, пока сервер получает всю строку от клиента telnet, а не по символу.

Любая помощь была бы высоко оценена!

+0

Почему вы не включаете '', чтобы получить все символические имена в качестве макросов? –

+0

Кроме того, что вы получаете за ответ на запрос? –

+0

Спасибо Joachim за предложение. Я получаю ответ - IAC IP IAC DO 6. – Alok

ответ

1

Похоже, что ваш способ договориться LINEMODE недействителен.

Вы не можете отправить IACSB из голубой для варианта, который не был первым переговоров с WILL или DO или что не ответил положительно с DO или WILL, соответственно.

В режиме линии, в частности, в соответствии с RFC 1184, на стороне сервера должны только когда-либо инициировать IACDOLINEMODE (не WILL).

Затем он будет ждать клиента, чтобы ответить либо IACWILLLINEMODE или IACWONTLINEMODE. В последнем случае вы ничего не можете сделать, так как клиент не хочет поддерживать режим линии в данный момент времени, а затем отправка субсогласования будет бессмысленной (соответствующий клиент будет просто игнорировать ее).

Если клиент ответил на ваш запрос с IACWILLLINEMODE, это означает, что далее подразделены переговоры режима линии будет иметь место, но это, как правило, инициируется клиентом, не вами (сервер).

Это означает, что теперь вы должны ждать клиента, чтобы отправить отправить IACSBLINEMODE что-то IACSE и в ответ на что вы должны запросить MODE и FORWARDMASK как подопций.

В частности, вы хотите, чтобы запросить EDIT быть превращена на в клиенте, так как это фактический режим, в котором клиент отправляет только полные линии, и что более важно, вы хотите сделать запрос TRAPSIG быть превращена от в клиенте , поскольку захват сигналов означает, что клиент перехватывает нажатые нажатия клавиш и переводит их в команды Telnet (например, IACIP), которые вы не хотите. То есть:

IACSBLINEMODEMODEIACSE

(1 означает EDIT на и TRAPSIG прочь.)

И вы также хотите, чтобы договориться о FORWARDMASK, где все биты, связанные с управляющие символы, которые вы хотите получить, установлены, в противном случае вы получите эти символы только тогда, когда клиент отправит завершенную строку или даже совсем не будет.

Для Ctrl-C (ASCII-3) запрос на минимальный вперед маска будет:

IACSBLINEMODEDOFORWARDMASKIACSE

(16 десятичное Следует отметить, что биты. считается начальным с MSB, а не LSB, что может сбить с толку, если вы не знаете об этом.)

Затем вам придется ждать, пока клиент подтвердит как режим, так и маску вперед. Клиент должен соблюдать запрос сервера для настроек EDIT и TRAPSIG, если он ранее согласился согласовать режим линии вообще (однако это не гарантирует, что он будет передавать специальные нажатия клавиш вам), но он свободен для отказаться от передней маски.

В конце концов, если вы хотите, чтобы клиент успешно согласовал с вами нужные параметры, вам необходимо убедиться, что вы придерживаетесь протокола как можно ближе. Я предлагаю вам по крайней мере прочитать и понять образец связи в section 5.10 of the RFC.

Смежные вопросы