3
내가, 예를 들어 같은 텔넷 클라이언트에 대한 연결을 여는 서버가

에 탭 완성을 구현하는 방법 : 내가 서버 ./server를 실행하고 다른 창에서 내가 텔넷 localhost를 9999으로 텔넷 클라이언트를 실행, 텔넷 클라이언트를 실행하면 CLI >>로 새로운 CLI 프롬프트가 표시됩니다.텔넷 클라이언트 측

이 프롬프트에서 사용자 지정 탭 완성이 필요하지만 많은 블로그에서 텔넷 쪽에서 구현 된 readline 기능을 사용할 수 없다고 말합니다. 그렇다면 우리는 자체 클라이언트를 사용해야합니다.

어떻게 처리합니까? 관련된 모든 도움을 주시면 대단히 감사하겠습니다. 나는 리눅스 (우분투)와 C 언어를 사용하고있다.

+0

[텔넷 프로토콜에 대한 자세한 내용은] http://en.wikipedia.org/wiki/Telnet을 참조하십시오. 특히 [관련 RFC] (http://en.wikipedia.org/wiki/Telnet#Related_RFCs) ([linemode 옵션] (http://tools.ietf.org/html/rfc1184)에 대한 것과 유사). –

답변

1

클라이언트 또는 서버에서 구현할 수 있습니다. 클라이언트 측 구현을 위해

은 (기본적으로 동일) 두 가지 방법이 있습니다 :

클라이언트가 연결
  1. 는, 서버가 명령과 인수 목록을 전송하고, 그에 캐시됩니다 클라이언트. 사용자가 TAB 키를 누르면 클라이언트는이 캐시 된 데이터를 검색합니다.

  2. 클라이언트가 TAB 키를 눌렀 음을 알 때 클라이언트는 가능한 완료 목록을 서버에 요청합니다. 속도면에서이 목록은 클라이언트 측에서 캐시되어야합니다.

그래서 기본적인 해결책은 다음과 같습니다. 서버가 클라이언트에 데이터를 보내고 클라이언트가 데이터를 표시합니다. 서버 측 구현을 위해


, 당신은 서버에 어떤 간섭없이 원시 않은 문자 키를 전송하기 위해 클라이언트에게 텔넷 협상을 사용해야합니다. 그런 다음 서버에서 TAB 키를 확인하고 완료 할 수 있습니다.

여기서 문제는 서버 코드에서 모든 명령 줄 편집 및 프롬프트를 추가해야하며 클라이언트에 "멍청한 터미널"이 될 수는 없다는 것입니다. 모든 처리 할 서버 측을 갖는


은 (는 텔넷 협상을 처리 할 수있는 한) 거의 모든 텔넷 클라이언트를 사용할 수 있습니다 및 사용자 정의 클라이언트를 만들 필요가 없습니다 상승 여력이있다. 단점은 서버 전체에서 명령 줄 편집 기능을 직접 구현해야한다는 것이며 각 키를 서버로 보내야하고 서버에서 다시 출력해야하기 때문에 키 누름 대기 시간이 길어질 수 있다는 것입니다.

커스텀 클라이언트를 갖는 것은 커맨드 라인 편집을 쉽게 처리하고 완성을 도울 수있는 라이브러리가 있다는 장점이 있습니다. 가장 큰 단점은 맞춤 클라이언트를 만들어야한다는 것입니다.

+0

Joachim 나는 클라이언트에서 '\ t'을받는 방법을 알고 싶었습니다 ... 큰 문제는 텔넷을 CHARACTER 모드로 설정 한 후 문자로 문자를 수집하는 방법입니다. – Puneeth

+0

@Puneeth 표준 텔넷 클라이언트를 사용하는 경우 그것은 문자 모드에있다, 그러면 그것은 그것을받는 즉시 서버에 탭을 보내야 만한다. 맞춤 클라이언트가 있다면 예를 들어 [GNU readline library] (http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html)는 탭에서 콜백 함수를 호출하기위한 탭 (또는 다른 문자)을 지원합니다. 암호. [custom completers here] (http://cnswww.cns.cwru.edu/php/chet/readline/readline.html#SEC44)에 대해 읽어보십시오. –

+0

@Puneeth 사용자 정의 GUI 기반 클라이언트가있는 경우 GUI에는 탭을 포함하여 키를 인식하는 기능이 있습니다. 이 경우 사용하는 GUI 툴킷에 대한 참조를 참조하십시오. –

0

텔넷 클라이언트를 문자 모드로 설정해야하므로 리턴 키가 전체 행을 보내기를 기다리는 대신 입력 할 때 각 키를 서버로 직접 보냅니다. 그런 다음 '\ t'을받을 때마다 '\ t'전에받은 것을 확인하고 회선을 완료 할 수 있는지 여부에 따라 전체 회선이나 가능성 목록을 되돌려 보냅니다. 기본적으로 서버에 readline()을 구현하고 있습니다.

+0

이 줄 모드를 문자 모드로 전환하는 방법을 알려줄 수 있습니까? 프로그래밍 또는 수동입니까? – Puneeth

+0

다음을 확인하십시오 : http://stackoverflow.com/questions/273261/force-telnet-client-into-character-mode –

+0

이 링크는 이전에 보았지만 정확하게 수행하지 못하는 경우 텔넷에 초보자입니다. 문자 모드를 활성화 할 필요가 있지만 어떻게 telnet 명령을 내리는 동안 .. telnet localhost 999 .. 아니면 프로그래밍과 관련이 있습니다 ... 또는 무엇을 입력해야하며 어디에서 명령을 내려야합니까? – Puneeth

0

텔넷 호스트 후에는 ctrl + ]을 입력하여 telnet 명령 프롬프트로 이동 한 다음 mode character을 실행하십시오. 그 다음에, 텔넷 클라이언트는 "한 번에 한 글자"모드로 들어가고 탭 완성이 잘 작동합니다.

[email protected]:~$ telnet 192.168.193.88 10015 
Trying 192.168.193.88... 
Connected to 192.168.193.88. 
Escape character is '^]'. 



my_prompt> 
my_prompt> 

my_prompt> 

my_prompt>^] 
telnet> mod character 

my_prompt�� 
my_prompt> 
my_prompt>