-マルチクライアント,非同期ソケットスレッドセーフで、c#、ベス?[定休日]
-
08-07-2019 - |
質問
ってより理解するためのtcp/ipソケットクライアントまで、フルのc#としてチャレンジしていきたい自分を見出すことができれば自分MMOインフラ(ゲームの世界地図、プレーヤーなど)のために純粋に教育を目的としているような意図のもう一つの"OMGZ izえんr0x0r MMORPGするよりもステキ!", システムについてimう。
とにかく、破壊も修復もおもしろくな人でくつかの光をどのよう設計アプローチこのようなシステムならびにダやココロはいろいろなことが必要で、かんだのですか?
最初のアイデアのシステムの別のクライアント/サーバーの接続と接続(独自のポートを行う特定のタスクの更新などのプレイヤー/モンスターの位置、送受信チャットメッセージ等あるうるデータ処理が容易になっていないと思わいを投入する必要があるヘッダのデータをどの情報をパケットが入っています。●
な意味が有るのは僕だけになると複雑んだろうって。
ご対応は非常によろしくお願いいたします。
解決
行っているのだとかのソケットレベルのプログラミング、その後にかかわらず多くのポートを開くためには、それぞれのメッセージタイプだいておく必要がヘッダの並べ替えができます。るべきであると思うの長さにすることができます。こ簡単に追加で単純なヘッダおよびテール構造へのメッセージ。いと思いやけがに対する取り組みとしては港のクライアント側で行われます。
この現代MMORPGs(かにも古いもの)の二つのレベルのサーバーログインサーバの検証として支払います。一度の検証これらのパス生まれのゲームサーバーを含むすべてのゲーム業界の情報です。もうここだけのお客様にとってソケットを開いない可とします。
また最MMORPGSものを暗号化すべてのデータです。を書いていてこれを行使しかし、これは問いませんいます。
設計/書プロトコルは一般のものに悩む:
Endianess
のクライアントとサーバーを常に保証されてはじendianess.ない処理の必要が私の直列化コードです。る方法は複数あり扱うendianess.
- 無視で明らかに悪い選択肢
- 指定しendiannessのプロトコルです。このプロトコルをさっているのネットワークめていたビッグエンディアンです。※なので実際にどのendianessを指定すだけで指定されたの。一部のcrusty古ネットワークプログラマですぐに武器を組み合わせて使用しない場合は大endianessが合わない場合にはサーバーは、ほとんどのクライアントはリトルエンディアンませんの買いだもの以外の余分な作業のプロトコルビッグエンディアンです。※
- マークのEndianess各ヘッダを追加することができますクッキーを伝えるendianessのクライアント/サーバーさせ、それぞれのメッセージ変換します。追加。
- くプロトコルagnostic-すべてASCII文字列、そしてendianessとは関係ないものもたくさんより効率的ではない。
の4通常は選べる2に指定しますendianess、多くのお客様、今日は少しエンディアンです。※
転送との下位互換性
のプロトコルが必要に転送および後方に対応しました。その答えはほとんど常にあります。場合は、この判定は、どのようにデザインしてみました、すべてのプロトコルのバージョン管理、それぞれ個別のメッセージを作成し扱いを少し変えることもないのバージョン管理.できpuntこの利用XML、本体を万が一紛失してしまっく効率化を実現しました。
全体のバージョン管理いデザインもシンプルです。のクライアントが送信したバージョン管理メッセージを指定することを語版X.Yとは、サーバをサポート版で返送メッセージを認識しのインタプリタのバージョンをクライアントとチャレンジです。そうでない場合はnacks、クライアントは接続を切断します。
のためには、それぞれのメッセージで、次のように
+-------------------------+-------------------+-----------------+------------------------+
| Length of Msg (4 bytes) | MsgType (2 bytes) | Flags (4 bytes) | Msg (length - 6 bytes) |
+-------------------------+-------------------+-----------------+------------------------+
の長さを明らかに分かるようにメッセージを含まない長さそのものです。のMsgTypeのタイプのメッセージ。二つのバイトをこの出来65356がたっぷりのメッセージの種類と応用例について詳しく述べる。のフラグはありませんから何をしなければいけないかを連載することができます。この分野の長さを与えているとお前と後退に対応しています。
const uint32_t FLAG_0 = (1 << 0);
const uint32_t FLAG_1 = (1 << 1);
const uint32_t FLAG_2 = (1 << 2);
...
const uint32_t RESERVED_32 = (1 << 31);
その後あなたのコードを直列化復元できない、次のように
uint32 length = MessageBuffer.ReadUint32();
uint32 start = MessageBuffer.CurrentOffset();
uint16 msgType = MessageBuffer.ReadUint16();
uint32 flags = MessageBuffer.ReadUint32();
if (flags & FLAG_0)
{
// Read out whatever FLAG_0 represents.
// Single or multiple fields
}
// ...
// read out the other flags
// ...
MessageBuffer.AdvanceToOffset(start + length);
ことができ 追加 新分野 終了 のメッセージなの改正に全体のプロトコルです。することで古いサーバやクライアントを無視するフラグんです。い場合は新しく開いたフラグおよび分野で、変えるだけで、全体のプロトコルバージョン。
使用フレームワークな
様々なネットワークの枠組みかの検討を使用できます。いった特定の必要性をゼロに行くと、標準的な枠組みこのケースを習いたいソケットレベルのプログラミングという問題で答えます。
場合に使用されないようにする方法は、枠組みをしてくださいアドレスに悩み、または少なくともいく方が必要な場合はカスタマイズでいます。
私の取扱を第三者に
多くの場合お取り扱う第三者のサーバー/クライアントで人とコミュニケーションです。この少数のシナリオ:
- てのプロトコルを定義し、単に使うプロトコルです。
- だき,誠にありがとうございプロトコルの定義(やって、彼らは喜んで使用でも簡単な使用は定義されたプロトコル
- 使用基準の枠組み(WSDLなどの)用の枠組み
- いるプロトコル確定してみdetermingのに基づいた最適なソリューションのすべての要因で手(すべてのものまであることが明らかにされた。どのcompetencey(てい).問わず、必ず両者合意のプロトコルです。経験からこの痛みは心地よい。もよいします。
いずれの場合でなさまと共に活動できることを第三者であり、このようんだけで追加でご提供しています。
を感じているような気分になりましたが書かれていますが、すでには長い.私は希望すれば具体的な質問でお願いStackoverflow.
編集回答knoopxの質問:
他のヒント
と思うのに必要な耐震性の低い住宅では、倒壊する前に歩きます。最初のデザインの枠組みとの接続、そして心配します。.ディスの場合の目標は、学習C#、tcp/ipプログラミングしんこくします。
利用者数は増加の一途を、期初の想いをデータストリーム分離を行います。
楽しみて下さい。
私の助言に対し複数の接続のための情報です。私はデザイン一部のプロトコルを含むヘッダ情報を処理します。としての利用は資源が乏します。もない場合があり送信したい更新、更にクライアントからはサーバー通信を行います。そのままである状態でユーザーの変更ができるデータの送信になります。
と言うユーザが改ざん、モンスターに位置するこを過ぎょう。私の更新のみのユーザーの位置ベクトルや行動します。の他の情報処理および検証には以下のルールを適用します。
えんそうかもしれませんのシングル接続、もちろん、お客様のpcるボタはお送りいただいた実際のデータをサーバによってだけで簡単コマンドは"前進"左"など。およびサーバー上の文字を地図上に送信し、新座す。