我想在 C 中实现一个 telnet 服务器。我将如何进行呢?我应该查看哪些 RFC?这对我很重要,我将不胜感激。
6 回答
对于非常基本的 telnet(只是 telnet 到端口和回显字节),没有什么可做的。从套接字读取,处理它(在回显服务器中,什么都不做),返回结果。您可以在不了解任何 RFC 的任何内容的情况下实现简单的 MUD 样式服务器。
但如果您真的关心 RFC,那么 RFC 854 可能是一个起点。
如果您对网络编程很认真,我强烈推荐 Richard W. Stevens 的“ UNIX 网络编程第 1 卷”——它比 RFC 具有很好的示例要好得多。
这是一本非常昂贵的书,但 eBay 上有便宜的平装本。即使你得到昂贵的精装版,它也值得你付出的每一分钱。
请注意,真正的 telnet不仅仅是一个处理用户登录 shellstdin
和的简单接口。stdout
“选项”中单独提供了许多附加功能,它们处理诸如设置$TERM
环境变量、设置行/列(如果用户调整终端大小则重置它们)之类的事情。
如果您正在寻找真正的telnet,而不仅仅是一个简单的 TCP 服务器,那么 RFC 854 确实是您的起点。然而,还有更多相关的 RFC 描述了上面提到的那些选项,这些选项列在http://en.wikipedia.org/wiki/Telnet
如果您需要有关套接字编程等方面的帮助。
结帐beej的指南:http ://beej.us/guide/bgnet/
我建议安装Wireshark以使用现有的 Telnet 服务器监视 Telnet 流量。然后查看日志,您可以更好地了解服务器如何与客户端通信。然后,如果您不了解通过网络传输的任何命令,请使用 RFC 作为参考。
了解套接字 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;
}