C で telnet サーバーを実装したいと考えています。どのように進めればよいでしょうか? どの RFC を確認する必要がありますか? これは私にとって重要であり、助けていただければ幸いです。
6 に答える
非常に基本的な telnet (ポートに telnet してバイトをエコーするだけ) の場合、やることはあまりありません。ソケットから読み取り、それを処理し (エコー サーバーでは何もしない)、結果を吐き出します。RFC について何も知らなくても、単純な MUD スタイルのサーバーを実装できます。
しかし、RFC に本当に関心がある場合は、RFC 854 が出発点になるかもしれません。
実際の telnet は、ユーザーのログイン シェルを処理する単純なインターフェイスではないことに注意してください。stdin
stdout
$TERM
環境変数の設定、行/列の設定 (およびユーザーが端末のサイズを変更した場合のリセット)などを処理する、「オプション」で個別に実行される追加機能が多数あります。
単純な TCP サーバーだけでなく、実際のtelnetを実行しようとしている場合は、RFC 854 が出発点です。ただし、 http://en.wikipedia.org/wiki/Telnetにリストされている上記のオプションを説明する、より関連性の高い RFC がスタックされています。
ネットワーク プログラミングに真剣に取り組んでいる場合は、Richard W. Stevens の「UNIX Network Programming Vol 1」を強くお勧めします。これは、優れた例を含む RFC よりもはるかに優れた読み物です。
非常に高価な本ですが、eBay で安価なペーパーバック版が入手できます。高価なハードカバー版を手に入れたとしても、それはあなたが支払ったすべてのペニーの価値があります.
ソケットプログラミングなどのヘルプが必要な場合。
チェックアウト 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;
}