networking - problemas - porque no puedo renderizar en revit
¿Cómo renderizar una consola ncurses remota? (2)
Quiero escribir una consola remota, que funcione como un servidor de telnet. El usuario puede usar telnet para iniciar sesión en el servidor y luego escribir algunos comandos para hacer algunos trabajos.
Un buen ejemplo para esto es la consola del enrutador os. Lo que estoy confundiendo ahora es que puedo aceptar la entrada del usuario, hacer algo y luego imprimir algunos textos, pero quiero usar ncurses para hacer que la consola tenga más funciones (como "cmd autocompletar", color de sintaxis ... ), entonces, ¿cómo puedo hacer eso? Debido a que la consola está en el lado del usuario, si el servidor llama a las API de ncurses, simplemente cambiará las cosas en el servidor ...
Tal vez esta es una pregunta estúpida, pero soy realmente novato en esto. Cualquier sugerencia es apreciada
Esto es más difícil de lo que piensas.
Debe comprender cómo funcionan las terminales : utilizan secuencias de control especiales para, por ejemplo, mover el cursor o la salida de color. Esto se describe mediante un archivo terminfo que es específico de la terminal. Ncurses
traduce llamadas API (por ejemplo, mueve el cursor a una posición determinada) a tales secuencias de control usando terminfo.
Dado que el terminal (hoy en día xterm
, gnome-terminal
, screen
, tmux
, etc.) está en el lado del cliente, debe pasar el tipo de terminal del cliente al servidor. Por eso, por ejemplo, ssh
pasa esta información del cliente ssh al servidor (prueba con echo $TERM
en tu sesión ssh; puede ser ''linux'' si estás conectado a través de la consola, o ''xterm'', si estás usando X y un xterm). Además, es mejor tener el terminfo respectivo disponible en el servidor.
Otra pieza del rompecabezas es pseudo terminales . Como en la actualidad, relativamente pocas personas usan terminales en serie, su semántica se emula para que las aplicaciones y bibliotecas (por ejemplo, curses
y sus amigos) desarrolladas originalmente para consolas serie sigan funcionando. Esto se logra a través de pseudo terminales: estos son como tubos, un maestro y un dispositivo esclavo se comunican, cualquier cosa escrita en un lado sale del otro lado. Para un proceso de inicio de sesión, getty
, por ejemplo, puede simplemente usar un lado de un pequeño dispositivo y pensar que es una línea serie: su programa de servidor debe manejar el otro lado del servidor , enviando todo lo que recibe de su cliente a través del servidor. red.
Los emuladores de terminal también usan ptys, escribe tty
en tu terminal y obtendrás algo como /dev/pts/9
si estás usando un emulador de terminal. En el otro lado de la sarta suele ser tu caparazón, comunicándose con tu emulador de terminal a través de la pty.
El programa de su cliente puede usar más o menos solo la entrada estándar y la salida estándar. Si la información de su terminal es correcta, el emulador de terminal manejará el resto, solo transfiera todo lo que reciba de su programa de servidor a stdout
y envíe todo lo que lea de stdin
a su programa de servidor.
Espero no haber omitido ningún detalle importante. ¡Buena suerte!
Es posible hacer que ncurses opere en transmisiones que no sean stdin y stdout. Llame a newterm()
antes initscr()
para establecer los manejadores de archivo de entrada y salida para ncurses.
Pero necesitará saber qué tipo de terminal se encuentra en el extremo remoto de la conexión (ssh y telnet tienen mecanismos para comunicar esto al servidor) y también querrá recurrir a una interfaz que no sea ncurses en caso de que el control remoto end no es un tipo de terminal compatible (o si no puede determinar el tipo de terminal).