FileZillaサーバーのソースコード分析



Filezilla Server Source Code Analysis



FileZillaサーバーのソースコード分析(1)


このシリーズの分析の理由は、2つの理由からです。
  1. FileZillaは現在非常に人気のあるオープンソースのftpプロジェクトであり、C ++コードを使用してプロジェクト全体が記述され、非常に読みやすいコードはコンパクトであり、学ぶ価値があります(欠陥もコメントです)。
  2. 既存のソースコード分析のネットワークはバージョン0.9.18に基づいており、分析はフレームまたは詳細のいずれかで大ざっぱです。
これが私の個人的なFileZillaサーバーのソースコードです 0.9.34 分析のバージョン、有限の容量、欠陥、および間違いも、あなたが私を自由に訂正してくれることを願っています。
映画が始まると、コンパイル方法(VS2010でソースコードをコンパイルするためのソースコード)、構成方法、および使用方法について少し説明します。 FileZilla公式サイト プログラムをダウンロードし、ソースコード(プログラムに含まれているソースコード、インストールはデフォルトではインストールされません)、コンパイル手順と注意事項を提供します。興味のある友人は、Quguanネットワークまたはgoogleを見つけることができます。

感謝:ユーザーを分析する一連の記事への参照 FileZillaFTPサーバーのソースコード分析 '比較を参照できます。

まず、ファイルレイアウトを大まかにソースディレクトリソースフォルダでプレビューします。



6つのサブディレクトリ、コアコード(スレッド、ソケット、コマンドなど)が現在のディレクトリに配置されます。 6および対応するコード機能サブディレクトリ:

サブディレクトリ 特徴
含まれています 現在のバージョンでは、サブディレクトリopensslのみであり、名前認識は表示することを目的としており、説明はあまりありません。
インストール インストールスクリプトとリソース
インターフェース UIインターフェース実装クラス
その他 md5、StdStringなどのより重要なハイブリッドクラス。
牛肉 コンパイルされたリソース、アイコンは1つだけです
tinyxml 小さなオープンソースの有名なxmlパーサーDOMベースのモデル

現在のソースディレクトリのソース関数の実現は、大きく次のタイプに分けられます。

機能分類 含まれるファイル
インターネット ソケットServerを含むすべてのファイル名。 *、
ファイル名にはファイルスレッドが含まれています
援助 バージョン。 *、MFC64bitFix。 *、 変換。 *、config.h、ファイルやスレッドの削除などのservice.cppネットワーク

ファイルディレクトリ構造の分析は終わりました。多数の.h.cppファイルに直面しているので、複雑な精子の取得に何かをする必要があります。バージョンなど、開始場所は関係ありません。 *。

バージョン。 *宣言は関数を定義しますCStdString GetVersionString()、注意すべきは、CStdStringこのクラスはmisc / stdString.hファイルに実装されており、クラスファイルは大きく、後で分析関数で実行されます。正直なところ、この関数は非常に収集可能です。

糸。 *定義されたスレッドクラスCThread、取引が行われたメッセージスレッドのRun関数に注意を払う必要があるだけで、仮想関数と呼ばれる有用な情報OnThreadMessage扱う。

2つのファイルstdafx.hとstdafx.cppVisual Studio C ++コードが最も一般的に発生するものを生成したため、必然的に、それらが最終的に何であるかを理解する必要があります。ヘッダーファイルには、マクロを定義し、同様に機能します。どのような構造として。

stdafx.hには、このドキュメントのconfig.hが含まれています。このドキュメントの役割を確認する方法です。コードには、Unicodeコンパイルの必須使用と、最新のSDKインストールかどうかのテストという2つの小さな目的があります。このドキュメントには、MFC64bitFix.hも含まれており、内部も確認できます。ストレージファイルの属性構造を定義しますCFileStatus64、多くのグローバル関数がそれを操作するだけでなく、ファイル名が少し​​奇妙で、機能が一致しません。
55行目で条件付きマクロが検出されました#ifdef MMGRその他/mmgr.hファイルを含むコンパイル条件が定義されています。 mmgrは、メモリの管理と追跡に使用されるコードです。その後、詳細な分析に焦点を当てます。
Conversion.hは、ANSIおよびUTF8の各文字を変換するための関数を宣言しました。多くの説明があります。
AsyncSocketEx.hは、分析後、派生クラスCAsyncSocketExに対してソケットが作成された後、非同期ソケット、ControlSocket、AdminListenSocketなどのドキュメントに実装されます。
これまでのところ、stdafx.hヘッダーファイルにはすべての終わりが含まれています。以下はマクロ定義です。

最初の補足知識、値の範囲、および以下の各メッセージの役割:


登録済みWM_FILEZILLA_THREADMSG定義されたスレッド間通信メッセージWM_FILEZILLA_SERVERMSG forプロセス間通信、つまりFileZillaserver.exeとFileZillaServerInterface.exe。
これらの2つの例の呼び出しメッセージを2つのソースコードに置くために、マクロは後で使用するために定義されたいくつかの定数を認識します。
// ControlSocket.cppの最初の400行
SendStatus(_T( ' 応答を送信できませんでした、切断されました。 ' )、 0 )。
m_pOwner
-> PostThreadMessage(WM_FILEZILLA_THREADMSG、FTM_DELSOCKET、m_userid)

//Server.cpp813サーキュレーター
int index = GetNextThreadNotificationID()
CServerThread * pThread = new CServerThread(WM_FILEZILLA_SERVERMSG + index)
m_ThreadNotificationIDs [index] = pThread

上記のコードからわかるように 2番目のパラメーターはwParamPostThreadMessageデジタルマクロで定義され、3番目のパラメーターは構造体ですt_statusmsg、これらのマクロ関数は次のとおりです。

FSM_STATUSMESSAGE:ステータス情報またはログ管理ウィンドウを表示および記録します
FSM_CONNECTIONDATA:および、新しいユーザー接続、ログイン、ログオフなどの接続関連情報。
FSM_THREADCANQUIT:スレッドを終了します
FSM_SEND:統計管理ウィンドウに送信されたデータバイトの送信
FSM_RECV:統計受信バイト管理ウィンドウのデータを受け入れます
残りはそれ以上書きません、より直感的なマクロ名は意味を示します。

の定義など、一連の構造のダウンt_statusmsg、使用後に詳細に配置し、これらの構造のどれが行のドキュメントで定義されているかを確認します。
extern HWND hMainWndアウトリーチが続くハンドルについては、ウィンドウクラスCServerハンドルの次のセクションで説明します。
最後にクラスを定義し、2つのCCriticalSectionWrapperがクリティカルセクションのデッドロック機能を検出するのに役立ちます。特に前者は、DEBUGバージョンによって現在のスレッドが中断された場合に間違っています。

制限速度 *:。速度制限(時間制限を含む)

ここでUIに対する強い抵抗、FillBufferこの関数はすべての制限をchar文字列にフォーマットし、ParseBufferは文字列を解析します。このクラスを使用すると、強力なカスタム速度制限関数を簡単に実装できます。

defs.h:このクラスは、オンライン、オフライン、ロックなどのサーバーの状態を定義します。


Options。*、OptionTypes.h

OptionTypes.hは、構造体の配列を定義しますm_OptinonsSSLを使用するかどうか、同時ユーザーの最大数、アップロードとダウンロードの速度制限など、すべての構成アイテム情報を保存します。これらはすべて、オプションダイアログUIの大部分で使用されます。
t_option構造には、アイテムがローカル接続のみを変更できるかどうかを示すために使用されるBOOL bOnlyLocalメンバーがあり、最後の2つの配列のみサーバー名とサーバー表示名がTRUEであり、オプションカテゴリはオペレーティングエンティティクラス構成ファイルです(tinyXMLを使用することに注意してください) )、サーバー構成exeファイルは、FileZillaSrver.xmlと呼ばれる同じディレクトリに保存されます。主な操作のオプションはメモリ内構成であり、デフォルトのエントリとは異なるものだけが構成ファイルに保存されます。
隠されたフォームクラスの友達がいるオプション COptionsHelperWindow、Cppはファイルで定義されており、クラスを更新するオプションは、オプションクラス自体ではなく、例としてこの非同期メッセージをポストWM_USERに形成するために使用されます。
オプションが定義されたOptionTypes.hクラスおよびタイプ構成(m_pOptions-> GetOptionVal(OPTION_ENABLELOGGING)など)を使用すると、構成によって簡単に取得できるメソッドになります。

FileLogger。 *ログ

このクラスには、構成ログファイルを読み取るためのクラスオブジェクトポインタオプションが含まれています。

iputils。 * IPの正当性と、フィルターが範囲内にあるかどうかの判断

有名なブースト正規表現ライブラリを使用して決定します。ライブラリが見栄えが良くなるまでには時間がかかります。

autobanmanager。 *ユーザーがファイルクラスメソッドをログに記録し続けるのを防ぐ

AutoBanこの設定項目は、2つのマップのIPクエリメモリごとに記録されなかったため、リソースの大きな浪費です。

アカウント。 *アカウント

Accounts.hは、t_directory、t_groupの3つのカテゴリで宣言されており、t_usert_groupからも継承されています。
t_directoryには、構造体に相当する権利宣言の一部のみが含まれ、t_groupt_userで使用されます。
残りの2つの主要なクラスは、構成の分析を読み取ることです。すべてのデータは文字列に基づいています。

許可。 *ユーザー、グループ、認証のためのリソースへのアクセス

アクセス許可の構成情報は、のFileZillaServer.xmlに記録されます。
サーバーには、グループとユーザーごとにアクセス制限があり、グループのアクセス許可はユーザーのアクセス許可よりも優先されます。CheckFilePermissions 機能が見られます。

お互いに変換します。 * Utf8およびansi文字


ExternalIpCheck。 * PASVモード

構成に応じたIPアクセス。

すべてのサポートドキュメントが分析されました。下部のセクションで、ソケットスレッドクラスの分析を開始します。