Telnet服务器

我想在C中实现一个telnet服务器。我该如何处理? 我应该看哪些RFC? 这对我很重要,我将不胜感激。

对于非常基本的telnet(只是telnet到端口和echo字节),没什么可做的。 从套接字读取,处理它(在回显服务器中,什么也不做),吐出结果。 您可以在不知道任何RFC的任何内容的情况下实现简单的MUD样式的服务器。

但如果你真的关心RFC,那么RFC 854可能就是一个起点。

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

如果你认真对待网络编程我会强烈推荐Richard W. Stevens的“ UNIX网络编程第一卷 ” – 它比RFC有更好的例子。

这是非常昂贵的书,但在eBay上有便宜的平装版。 即使你得到昂贵的硬封面版,也值得你付出的每一分钱。

请注意,真正的telnet不仅仅是一个处理用户登录shell的stdinstdout的简单接口。

在“选项”中分别进行了许多附加function,这些function处理诸如设置$TERM环境变量,设置行/列(以及在用户调整终端大小时重置它们)之类的事情。

如果您正在寻找真正的 telnet,而不仅仅是一个简单的TCP服务器,那么RFC 854确实是您的起点。 然而,堆栈更相关的RFC描述了上面提到的那些选项,这些选项列在http://en.wikipedia.org/wiki/Telnet

如果您需要插槽编程等方面的帮助

checkout beej的指南: http ://beej.us/guide/bgnet/

了解套接字API如何在内部工作非常有用,因为它通常通过更高级别的语言进行非常小的更改而导出。

也就是说,您可能希望使用GLib提供的事件循环支持并使用相关的网络库GNet 。

以下是如何使用GNet在端口4000上打开套接字,然后关闭与其建立的每个连接。 这里有一点魔力,因为服务器将其自身注册为默认主要上下文作为其创建的一部分。

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

我建议使用现有的Telnet服务器安装Wireshark以观察Telnet流量。 然后查看日志,您可以更好地了解服务器如何与客户端通信。 然后,如果您不理解通过网络传输的任何命令,请使用RFC作为参考。