5

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

4

6 回答 6

9

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

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

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

于 2008-11-06T03:07:10.110 回答
4

如果您对网络编程很认真,我强烈推荐 Richard W. Stevens 的“ UNIX 网络编程第 1 卷”——它比 RFC 具有很好的示例要好得多。

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

于 2008-11-06T07:12:44.450 回答
4

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

“选项”中单独提供了许多附加功能,它们处理诸如设置$TERM环境变量、设置行/列(如果用户调整终端大小则重置它们)之类的事情。

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

于 2008-11-07T07:52:29.893 回答
3

如果您需要有关套接字编程等方面的帮助。

结帐beej的指南:http ://beej.us/guide/bgnet/

于 2008-11-06T04:41:08.843 回答
-1

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

于 2010-06-17T17:54:15.170 回答
-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;
}
于 2008-11-07T07:07:48.190 回答