0

免責事項: これは宿題です。私は解決策を望んでいません。

また、c/c++ 標準ライブラリ以外のライブラリは使用できません。

割り当てられた学期プロジェクト (仮想 FTP サーバーの作成) のこの部分の作業が私に何を求めているのかを理解するために、正しい方向へのプッシュを探しています。

サーバーでは、仮想ファイルシステムを作成できます。仮想ファイルシステムとは、提供されたディレクトリをファイルシステム上の実際のディレクトリにマッピングすることを意味します。たとえば、クライアント ツリーは次のようになります。 /home/user1 は /mnt/x/home/user1 にマップされます。 /www は /var/cache/www にマップされます。ユーザーには、/home/user1 ディレクトリと /www ディレクトリ、およびファイル /home/user_list.txt が表示されます。

私は講師に次の質問をしました。

サポートする必要があるディレクトリ マッピングは/home/user1 -> /mnt/x/home/user1/www -> /var/cache/www、およびだけですか?/var/cache/www/home/user_list.txt -> /var/ftpclient/user_list.txt

次の返信がありました。

これらのマッピングは単なる設定例です。あなたのソリューションは、同様の方法で何でもマップできるはずです。

私の現在の理解では、FTP サーバーのユーザーに、明示的にマップされた (構成ファイルで指定された) ディレクトリとファイルへのアクセスのみを許可する必要があります。これはおそらく次のようなマッピングを意味し/home -> /home/usersます (したがって、すべてのユーザーは、FTP を使用するための疑似ルート ディレクトリにいることがわかります。たとえば、ユーザー Bob は/home/bob/.

また、実際の基盤となるファイル システムで動作する 、 などのlsFTPコマンドをサポートするには、どの API を使用する必要がありますか?cd

4

2 に答える 2

1

独自の FTP サーバー (または少なくともその一部) を作成しています。/home/bobに変換する問題を解決する必要があり/home/users/bobます。これを行う方法は、誰かが を入力した場合cd /home/bob、渡されたファイルの場所を、ユーザーが提供した pat (この場合は/home/bob) を「実際の」形式 ( /home/users/bob) にする前に受け取る関数に変換するだけです。chdirディレクトリを実際に変更する関数に渡されます。のようなものを作成して正しいパスpwdls表示するには、「自分がどこにいるかを覚えておく」必要があります (誰かが 、 、または に移動したい場合があることにcd ../joe注意cd ../tom/.././mats/../joecd ..; cd joe/home/joeください。/home/users/joeas /home/joe- つまり、あなたのcd.移動するには、現在のディレクトリと親ディレクトリを理解する必要があります)、または を取得して思いつく..「逆変換」が必要です。後者の方が簡単であるというのが私の現在の考えですが、私はこの問題を正確に解決していません。/home/users/joe/home/joe

従うことができる解決策はおそらくいくつかありますが、「文字列の開始に一致」と絶対パスでの作業は、非常に複雑なことをしたい場合や、ユーザーが本当に複雑なことをする必要がない場合を除いて機能します。たとえば、このマッピングがある場合:

/home -> /mnt/x/home     (e.g /home/bob becomes /mnt/x/home/bob)
/www  -> /var/cache/www    (e.g /www/index.html becomes /var/cache/www/index.html)

ここで、ユーザーが行う場合:

cd /home/bob/../../www/    (could be worse with more . and .. mixed in)

次に、自分がどこにいるかを実際に理解し、fix up ../.. を / に再度変換する必要があります。[もちろん、cd /home/bobthencd ..を使用した同様の問題は、同様の問題をcd www引き起こす可能性があります]。

それがあなたの講師によって実際に必要とされているかどうかを明確にします。

必要ない場合は、で始まるすべてのものの先頭に一致させ/ます (それ以外はすべて、chdir変更せずに渡すだけです) 。

于 2014-06-11T20:49:27.747 に答える
0

最後の質問は最も簡単です。Boost Filesystem ライブラリを使用してください。ファイル パスなど、必要なタイプが含まれています。

最初の質問のアイデアはGET /home/user_list.txt、 の内容を返すことです/var/ftpclient/user_list.txt。つまり、最初に仮想名を実際の名前に変換する必要があります (ここでは多少の空想が可能ですが、基本的には、仮想名のプレフィックスが変換テーブルに表示されるかどうかを確認する必要があります。空想には、名前が見つからない場合の処理​​が含まれます。 )。次に、実際の名前でそのファイルを開き、その内容を読み取り、それらをクライアントに返します。

于 2014-06-11T20:58:09.297 に答える