2015-06-04 41 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上telnet提示符,客戶端仍然通過遠程登錄命令,而然後ASCII值。由服務器接收

消息:IAC IP IAC DO 6(定時標記)

而不是 「IAC IP」 我想接收CTRL + C(3)。

任何想法如何讓我的客戶端發送跨越ASCII值而不是telnet命令,而服務器從telnet客戶端接收整行不是逐字符。

任何幫助將不勝感激!

+0

爲什麼不包含''來獲取所有符號名稱作爲宏? –

+0

另外,您如何回覆請求? –

+0

感謝Joachim的建議。我得到答覆 - IAC IP IAC DO 6。 – Alok

回答

1

看來你的方式來協商LINEMODE是不正確的。

不能發送IACSB出藍色的爲尚未與WILLDO或尚未與DOWILL,分別正面答覆首次談判的選項。

對於特定行模式下,根據RFC 1184,服務器側應僅發起IACDOLINEMODE(不是WILL)。

它將然後等待客戶端回覆要麼IACWILLLINEMODEIACWONTLINEMODE。在後一種情況下,你不能做任何事情,因爲客戶在這個時候不願意支持線路模式,並且隨後發送子協商將毫無意義(一個合格的客戶將會忽略它)。

如果客戶回答IACWILLLINEMODE你的要求,這意味着行模式進一步細分協商會發生,但它通常由客戶端發起,而不是由你(服務器)。

這意味着你現在應該等待客戶端發送發送IACSBLINEMODE東西IACSE和反應,你應該要求MODEFORWARDMASK的子選項。

特別是,要申請EDIT可以在客戶端上打開,因爲這是要請求TRAPSIG在客戶端打開關閉客戶端只發送完整的生產線,更重要的是實際的模式,因爲捕獲信號意味着客戶端截獲有問題的按鍵,並將它們轉換爲Telnet命令(如IACIP),而您的不想要。那就是:

IACSBLINEMODEMODEIACSE

(1表示EDITTRAPSIG關閉。)

而且你還需要談判,其中與相關聯的所有位FORWARDMASK您希望接收的控制字符被設置,否則只有當客戶端發送完成的行時纔會收到這些字符,甚至根本不會收到這些字符。

對於Ctrl-C鍵(ASCII 3)的最小前向掩模請求將是:

IACSBLINEMODEDOFORWARDMASKIACSE

(16是小數注意,比特。從MSB開始計算,而不是LSB,如果您不知道它可能會造成混淆。)

然後,您將不得不等待客戶端確認模式以及正向掩碼。如果客戶以前同意協商線路模式(但是,這並不能保證它將通過特殊的按鍵給你),那麼客戶端必須遵守服務器對EDITTRAPSIG設置的請求,但它是免費的拒絕正面面具。最後,如果您希望客戶端能夠與您成功協商所需的選項,則需要確保您儘可能地將協議保持在最接近的位置。我建議你至少閱讀並理解section 5.10 of the RFC中的示例溝通。