Сервер Telnet - PullRequest
       12

Сервер Telnet

5 голосов
/ 06 ноября 2008

Я хотел бы реализовать сервер Telnet на C. Как мне поступить с этим? Какие RFC мне следует посмотреть? Это важно для меня, и я был бы признателен за любую помощь.

Ответы [ 6 ]

9 голосов
/ 06 ноября 2008

Для очень простого telnet (просто telnet на порт и эхо-байты) делать особо нечего. Прочитать из сокета, обработать его (на эхо-сервере, ничего не делать), выплюнуть результат. Вы можете реализовать простой сервер в стиле MUD, ничего не зная ни в каких RFC.

Но если вы действительно обеспокоены RFC, то RFC 854 может стать отправной точкой.

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

4 голосов
/ 07 ноября 2008

Обратите внимание, что настоящий telnet - это , а не , это просто простой интерфейс, который обрабатывает stdin и stdout оболочки входа пользователя.

Существует множество дополнительных функций, которые переносятся отдельно в 'options', которые обрабатывают такие вещи, как установка переменной окружения $TERM, установка строк / столбцов (и их сброс, если пользователь изменяет размер своего терминала).

Если вы хотите использовать real telnet, а не просто TCP-сервер, тогда действительно RFC 854 является вашей отправной точкой. Однако есть стеки более релевантных RFC, которые описывают те опции, упомянутые выше, которые перечислены в http://en.wikipedia.org/wiki/Telnet

4 голосов
/ 06 ноября 2008

Если вы серьезно относитесь к сетевому программированию, я очень рекомендую Ричарда У. Стивенса « Сетевое программирование UNIX Том 1 » - это намного лучше, чем чтение RFC с отличными примерами.

Это очень дорогая книга, но на eBay доступно дешевое издание в мягкой обложке. Даже если вы получаете дорогостоящее издание в твердом переплете, оно стоит каждой копейки, которую вы заплатили.

3 голосов
/ 06 ноября 2008

Если вам нужна помощь с программированием сокетов и т. Д.

Оформить заказ руководство Beej: http://beej.us/guide/bgnet/

0 голосов
/ 17 июня 2010

Я рекомендую установить Wireshark для просмотра трафика Telnet с использованием существующего сервера Telnet. Затем, просматривая журнал, вы сможете лучше понять, как сервер взаимодействует с клиентом. Затем используйте RFC в качестве справки, если вы не понимаете ни одной из команд, идущих по проводам.

0 голосов
/ 07 ноября 2008

Очень полезно знать, как работает API-интерфейс сокетов, поскольку он часто экспортируется с очень незначительными изменениями в языках более высокого уровня.

Тем не менее, вы можете использовать поддержку цикла событий, предоставляемую GLib , и использовать соответствующую сетевую библиотеку GNet .

Вот как использовать GNet, чтобы открыть сокет на порте 4000, а затем закрыть все подключения к нему. Здесь есть немного волшебства, поскольку сервер регистрируется в основном контексте по умолчанию как часть своего создания.

#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;
}
...