問題タブ [socketasynceventargs]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1020 参照

c# - ソケット キューの問題

こんにちは、私はこの問題を抱えています。

私はソケット チャット (クライアント サーバー) モジュールを構築する必要があり、作業のほぼ 80% を完了しましたが、今は立ち往生しています。シナリオは、サーバー アプリがあり、4 つのクライアントがサーバーに接続されている場合、クライアントがそれに接続するというものです。それぞれが互いに通信できます.1つのクライアントがメッセージを送信し、サーバーがそのメッセージを受信して​​渡します.これは非常にうまく機能していますが、2つ以上のクライアントが同時に3番目のクライアントにメッセージを送信すると. 1 つのメッセージを取得せず、クライアントが切断される キュー構造を構築する必要があることはわかっていますが、成功していません ここに私のコード構造があります

まず、このメソッドを呼び出して、着信メッセージのリッスンを開始します

そして、1つのメッセージを受け取ったら、同期または非同期が完了したかどうかを確認します

この後、1つの受信操作が完了するたびに呼び出されるio完了リスナーがあり、そのio完了メソッドで、受信したチャンクを処理するために使用されるprocessReceiveメソッドを呼び出すので、最終的に私のコード構造はこのようになります

すべてのクライアントがサーバー側で Receive SOCKETASYNCEVENTAGRS オブジェクトと Send SOCKETASYNCEVENTAGRS オブジェクトを持つように構造を設計し、このためのプールを維持します

したがって、各クライアントは独自の SOCKETASYNCEVENTAGRS オブジェクトを介してデータを送受信します

2 つ以上のクライアントが 3 番目のクライアントよりも 3 番目のクライアントにメッセージを送信する場合、3 番目のクライアントがすべてのメッセージを同時に受信するのではなく、代わりにキュー構造を持ち、一度に 1 つのメッセージを受信し、送信操作でも同じようにするシナリオが必要です

ここに私のコードの一部があります

これは IO 完了です

これは Queue が実装された私の StartReceive ですが、機能していません

まともな助けや良い方向を探している

0 投票する
1 に答える
2449 参照

c# - 非同期udpネットワーキングを正しく行う方法は?

ここにいる他の多くの人たちと同じように、ネットワーク ライブラリを作成しようとしています。要件は基本的に次のようになります。

  • 非同期で動作し、リアルタイム アプリケーションの準備を整える (私は FPS ゲームを念頭に置いています)
  • UDP を使用し、必要に応じてその上に薄いプロトコル レイヤーをセットアップします
  • IPv6 でネイティブに動作する
  • 複数のプラットフォームをサポートします (参照: Mono サポートが必要です!)

これを行う方法について読んだ後 (最も刺激を受けたのはGaffer on Gamesでした)、開発環境をセットアップし、その方法について考え、次の基本的なワークフローを思いつきました。

  1. ソケットを初期化し、「UDPv6」を使用するように指示します
  2. そのソケットをポートにバインドし、例外をユーザーに迷惑をかけないようにします。ソケットが正しく設定されていることを彼に伝える「バウンド」プロパティがあります。
  3. ローカル マシンの NIC がサポートする最大 MTU について調べます。
  4. いくつかの SocketAsyncEventArgs を初期化し、その Completed イベントにプライベート ディスパッチ メソッドを呼び出すように指示し、そのバッファーを手順 3 の最大 MTU のサイズに設定します。
  5. 最初の SAEA オブジェクトを使用して Sockets ReceiveFromAsync メソッドを呼び出します。

データが入ってきたら、次のことを行います。

  1. 次の空いている SAEA オブジェクトを使用して ReceiveFromAsync メソッドを呼び出す
  2. 現在の SAEA オブジェクトからバッファと送信者の情報を取得し、再び使用できるようにします
  3. 受信したメッセージで新しいイベントを発生させます。

このアプローチでいくつかのテストを行いましたが、非常にうまく機能しています。10000 サイクルで 200 バイトのデータを含むメッセージを 10 ミリ秒ごとに送信しましたが、CPU やメモリの負荷はほとんど増加しませんでした。NIC の負荷のみが増加しています。しかし、私はいくつかの問題を思いついた | 質問:

  • (ソケットを保持している) PeerSocket クラスを破棄すると、すべての SAEA オブジェクトが破棄されます。しかし、そのうちの少なくとも 1 つはまだ新しいメッセージをリッスンしているため、ObjectDisposedException がスローされます。聞くのをやめるように伝える方法はありますか?
  • MTU は他のピアへの途中で異なる場合があります。おそらく、各 SAEA オブジェクトのバッファーは、バッファー サイズを決定するために異なるインジケーターを使用する必要がありますか?
  • 断片化されたデータグラムを処理する方法がまだわかりません。送信するデータグラムにその「信頼性ヘッダー」を書き込んでいきますが、データグラムが分割されている場合、このヘッダー情報についてはわかりませんよね?

このライブラリは、いつか誰かの役に立ち、リポジトリが公開されることを願っています。この質問の時点で、現在のコミットはここにあります

0 投票する
1 に答える
304 参照

c# - Windows Server 2003 での C# SocketAsyncEventArgs の問題

このトピックについてはあまり見つけることができませんでしたが、最近、SocketAsyncEventArgs オブジェクトを使用してソケット サーバーを実装しています。私は次の例に従いました: Code Project Example

必要に応じてデータ処理クラスを変更しましたが、ソケット処理部分はほとんど触れませんでした。

自分のマシン (win7) でローカルにサービスをテストすると、問題なく動作しているように見えます。Windows Server 2008 で実行する場合も同じです。Windows Server 2008 で実行する場合、メモリ使用量は 50k で推移します (タスク マネージャーから表示)。

.net 4 までのすべての .net アップデート/パッチを含む Windows Server 2003 でサービスを実行すると、次のエラーが表示されます。

これに関連するコード行は次のとおりです。行 326

289行目

このサーバーは、データ (小さなテレメトリ ペイロード) を送信するために、リモート クライアントから常に接続されています。このサーバーでは、データを解析して応答を返し、ソケットが接続されている間、これを続けます。

私は提案や試してみることにオープンです。もう 1 つの注意事項は、win2k3 でこのサービスを実行すると、サーバー 2008 の 50 ~ 60Kb の範囲に対して、メモリ使用量が 600+Kb に急増し、上記のエラーがスローされることです。

0 投票する
1 に答える
2762 参照

c# - SocketAsyncEventArgs を使用して高スケーラブルなソケット サーバーを作成する

さて、スケーラビリティの高いサーバーの作成に関する多くの質問を読みましたが、実際に良い答えに出くわすことはありませんでした. とにかく、大量のデータと接続を処理する、拡張性の高いクライアントを作成したいと考えています。私が作成したのは、次のような SocketAsyncEventArgs と C#5 async/await を使用する単純なクライアントです。

ConnectAsync、ReceiveAsync、AcceptAsync についても同様です。これはクライアント部分ではうまく機能しますが、私のサーバーではそれを正しく行う方法がわかりません..(受信するクライアントごとにスレッドを作成することになります.)APM(開始/終了)またはEventHandler を使用していますが、それは async/await を使用する目的を殺し、最終的にはすべての呼び出しに対して新しい SocketAsyncEventArgs を作成するときにメモリ効率が良くありません。(ConcurrentBag を使用して) プールを作成しようとしましたが、TaskCompletionSource を何度も作成する必要がありました (一度しか使用できないため)。

だから私はこれを作成するのは良い考えではないと思いますが、私はそれが本当に好きです.. 高スケーラブルで高性能なサーバーを作成するための良い設計は何ですか?