c telnet

c - Servidor Telnet



(6)

Me gustaría implementar un servidor de telnet en C. ¿Cómo procedería con esto? ¿Qué RFCs debería ver? Esto es importante para mí, y agradecería cualquier ayuda.


Para telnet muy básico (solo telnet a un puerto y bytes de eco), no hay mucho que hacer. Leer de un socket, procesarlo (en un servidor de eco, no hacer nada), escupir un resultado. Podría implementar un servidor simple estilo MUD sin saber nada en ningún RFC.

Pero si realmente te preocupan las RFC, RFC 854 podría ser un punto de partida.

http://www.faqs.org/rfcs/rfc854.html



Si se toma en serio la programación en red, recomendaría encarecidamente " UNIX Network Programming Vol 1 " de Richard W. Stevens: es mucho mejor lectura que los RFC con excelentes ejemplos.

Es un libro muy caro, pero hay una edición en rústica barata disponible en eBay. Incluso si obtiene una edición costosa de tapa dura, vale cada centavo que pagó.


Saber cómo funciona la API de socket internamente es muy útil, ya que a menudo se exporta con cambios muy pequeños por idiomas de nivel superior.

Dicho esto, es posible que desee utilizar el soporte de bucle de eventos provisto por GLib y usar la biblioteca de red relacionada GNet .

A continuación, se explica cómo usar GNet para abrir un socket en el puerto 4000 y luego cerrar cada conexión que se haya realizado. Aquí hay un poco de magia ya que el servidor se registra con el contexto principal predeterminado como parte de su creación.

#include <glib.h> #include <gnet.h> void client_connect(GServer G_GNUC_UNUSED *server, GConn *conn, gpointer G_GNUC_UNUSED user_data){ g_print("Connection from %s/n", conn->hostname); gnet_conn_disconnect(conn); gnet_conn_unref(conn); conn = NULL; } int main(void){ GMainLoop *loop = g_main_loop_new(NULL, FALSE); GServer *server; gnet_init(); server = gnet_server_new(NULL, 4000, client_connect, NULL); g_main_loop_run(loop); g_main_loop_unref(loop); loop = NULL; return 0; }


Tenga en cuenta que telnet real no es solo una interfaz simple que maneja stdin y stdout del shell de inicio de sesión del usuario.

Hay muchas funcionalidades adicionales que se transportan por separado en ''opciones'', que manejan cosas como establecer la variable de entorno $TERM , configurar las filas / columnas (y restablecerlas si el usuario cambia el tamaño de su terminal).

Si está buscando hacer Telnet real , y no solo un simple servidor TCP, entonces RFC 854 es su punto de partida. Sin embargo, hay montones de RFC más relevantes que describen las opciones mencionadas anteriormente que se enumeran en http://en.wikipedia.org/wiki/Telnet


Recomiendo instalar Wireshark para ver el tráfico de Telnet usando un servidor Telnet existente. Luego, mirando el registro, puede obtener una mejor comprensión de cómo el servidor se comunica con el cliente. Luego, use el RFC como referencia si no entiende alguno de los comandos que cruzan el cable.