0

C# で簡単なソケット プログラミングを行っています。クライアントコンソールからユーザー名とパスワードを読み取り、資格情報をサーバーに送信し、サーバーから認証ステータスを返すことで、ユーザーを認証しようとしています。基本的なもの。私の質問は、データがサーバーとクライアントの両方が期待する形式であることを確認するにはどうすればよいですか?

たとえば、クライアントでユーザー資格情報を読み取る方法は次のとおりです。

                Console.WriteLine("Enter username: ");
                string username = Console.ReadLine();
                Console.WriteLine("Enter plassword: ");
                string password = Console.ReadLine();

                StreamWriter clientSocketWriter = new StreamWriter(new NetworkStream(clientSocket));
                clientSocketWriter.WriteLine(username + ":" + password);
                clientSocketWriter.Flush();

ここでは、クライアント側でユーザー名とパスワードをコロン (またはその他の記号) で区切ります。サーバーでは、「:」をトークンとして使用して文字列を分割するだけです。これは機能しますが、ちょっと... 安全ではないようです。クライアントとサーバー間で共有されるある種の区切りトークンがあるべきではないので、このようにハードコーディングする必要はありませんか?

サーバーの応答についても同様です。認証が成功した場合、クライアントが期待する形式で応答を返すにはどうすればよいですか? 単純に「SUCCESS」または「AuthSuccessful=True/False」という文字列を送信しますか? サーバーがデータを送信する形式をクライアントが認識できるようにするにはどうすればよいですか (クライアントにハードコーディングする以外に)。

私が求めているのは、アプリケーションレベルのプロトコルを設計および実装する方法だと思います。あなたのアプリケーションに特有のものだと思いますが、プログラマーが一般的に使用する典型的なアプローチは何ですか? さらに、どのようにしてフォーマットの一貫性を保っていますか? この件に関する記事へのリンクもいただければ幸いです。

4

4 に答える 4

1

車輪の再発明ではなく。XMLスキーマをコーディングして、XML「ファイル」を送受信してみませんか。

あなたのメッセージは確かに長くなりますが、ギガビットイーサネットとADSLではこれは最近ほとんど問題になりません。取得できるのは、文字セット、複雑なデータ構造のすべての問題がすでに解決されているプロトコルに加えて、開発をサポートおよび容易にするためのツールとライブラリの困惑した選択です。

于 2011-04-20T06:27:12.433 に答える
1

可能であれば、プレーン ASCII テキストを使用することを強くお勧めします。これにより、バグの検出と修正がはるかに容易になります。

いくつかの一般的な機械可読 ASCII テキスト プロトコル (大まかに複雑さの順):

世界はすでに十分に複雑なので、機能する最も複雑でないプロトコルを使用しようとします。ユーザーが生成した 2 つの文字列をあるマシンから別のマシンに送信する -- netstrings は、私のリストの中で最も単純なプロトコルであり、そのために機能するので、netstrings を選択します。(ネット文字列は、ユーザーがいくつかのコロン、セミコロン、二重引用符、またはタブを入力しても正常に機能します。一般的に入力される特定の文字を詰まらせる他の形式とは異なります)。

サーバーとクライアントの両方が何らかの方法で「#include」するか、そのプロトコルを使用できるように、単一の共有ファイルにプロトコルを記述する方法があればいいと思います。次に、プロトコルのバグを修正するときに、1 か所で修正し、サーバーとクライアントの両方を再コンパイルすれば、両側で固定配線された定数の束を掘り下げるのではなく、問題なく機能します。

適切に作成された C コードと C++ コードがヘッダー ファイルで関数プロトタイプを使用する方法に似ているため、一方では関数を呼び出し、他方では関数自体を呼び出すコードは、双方が期待する方法でパラメーターを渡すことができます。 .

そのようなものを見つけたら教えてください。

于 2011-06-14T03:29:15.967 に答える
0

私は主に 2 つのアプローチで取り組みました。

1 つ目は、ASCII ベースのプロトコルです。

Ascii ベースのプロトコルは通常、定義された区切り文字 (キャリッジ リターン、セミコロン、xml、json など) で終了する一連のテキスト コマンドに基づいています。プロトコルがコマンドベースのプロトコルであり、大量のデータがやり取りされない場合は、これが最善の方法です。

FIND\r
DO_SOMETHING\r

テキストベースのため、読みやすく、理解しやすいという利点があります。欠点 (問題ではないかもしれませんが、問題になる可能性があります) は、クライアントとサーバーの間で転送されるバイト数が未知数になる可能性があることです。したがって、送受信されているバイト数を正確に知る必要がある場合、これは必要なタイプのプロトコルではない可能性があります。

もう 1 つのタイプのプロトコルは、ヘッダーで送信される固定サイズのメッセージを使用するバイナリ ベースです。これには、クライアントが受け取ると予想されるデータの量を正確に把握できるという利点があります。また、送信内容によっては、帯域幅を節約できる可能性もあります。ascii もスペースを節約できますが、アプリケーションの要件によって異なります。バイナリベースのプロトコルの欠点は、見ただけでは理解するのが難しいことです..常にドキュメントを見る必要があります.

実際には、アプリケーションの要件に基づいて定義したプロトコルに両方の戦略を混在させる傾向があります。

于 2011-04-20T06:33:12.743 に答える
0

基本的に、あなたは標準を探しています。「規格の素晴らしいところは、選択できるものが非常に多いことです」. 1 つ選んで、それを使いましょう。自分で作成するよりもはるかに簡単です。この特定の状況については、1 つの可能性として、ユーザー名とパスワードを結合して base64 エンコードする Apache の「基本」認証を調べてください。

于 2011-04-20T06:22:05.237 に答える