Telnet服务器

6
我希望能够在C中实现一个telnet服务器。我该如何进行?我应该查看哪些RFC?这对我很重要,我会感激任何帮助。

是为了好玩还是为了课业作业? - sk.
1
我不能确定,但我认为这对他至少是重要的... - PhirePhly
如果是为了实际使用,应该是一个SSH服务器... - bortzmeyer
根据http://stackoverflow.com/questions/20790367/what-is-the-final-rfc-for-telnet-protocol,RFC 5198是当前的RFC。 - Jerry Jeremiah
6个回答

9

如果只是进行基本的telnet(只需连接到端口并回显字节),则没有太多要做的。从套接字读取数据,处理它(在回显服务器中不做任何操作),然后返回结果。即使不了解任何RFC,您也可以实现一个简单的MUD样式服务器。

但是,如果您真的关心RFC,RFC 854可能是一个起点。

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


2
这个问题听起来像是作业题。他得到了一个适合作业的答案。你想要补充什么? - Mitch Haile
NVT终端的管理,转义序列等。 - bortzmeyer
1
这个答案是不正确的。基本的telnet工作需要建立连接(包括选项协商)。在服务器提示用户输入登录/密码/命令之前,一堆telnet协议命令必须正常工作。这个序列图展示了发生了什么:http://www.eventhelix.com/realtimemantra/networking/Telnet.pdf - gaoithe

4
如果你对网络编程很认真,我强烈推荐Richard W. Stevens的 "UNIX Network Programming Vol 1" - 它比RFC更好阅读,有很好的例子。
这是一本非常昂贵的书,但在eBay上有便宜的平装版可供选择。即使你购买了昂贵的精装版,也值得你花费每一分钱。

4
请注意,真正的telnet并不仅仅是处理用户登录shell的标准输入和标准输出的简单界面。
有许多额外的功能在“选项”中单独处理,例如设置$TERM环境变量、设置行/列(以及如果用户调整终端大小则重新设置行/列)。
如果您想要进行真正的telnet,而不只是一个简单的TCP服务器,那么RFC 854确实是您的起点。然而,还有更多相关的RFC描述了上述那些选项,这些选项在http://en.wikipedia.org/wiki/Telnet中列出。

3

-1

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


1
这是极其糟糕的建议。先阅读RFC,然后再查看Wireshark跟踪记录。 - Alnitak

-2

了解套接字 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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接