問題タブ [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.
.net - 1000 クライアントでの begin/end と socketasynceventargs の比較
開発速度と安定性の両方で、どの非同期型が最適かを考えています。1000 の同時クライアントをサポートするネットワーク アプリケーションの概念実証を作成しています。
各クライアントは、毎秒 30 バイトのパケットを約 5 個送信します。サーバーは毎秒 200 バイトのパケットを約 5 個送信します。
これらの数値は、ブロッキング ソケットを使用した以前のテストから取得しました。高スループットの SocketAsyncEventArgs の原因を使用する必要があると思いますが、開発には少し時間がかかります。
ありがとう
c# - SocketAsyncEventArgs の Send 関数
私は C# クライアント/サーバー アプリケーションに取り組んでおり、SocketAsyncEventArgs クラスを使用しています。クライアントからメッセージを送信でき、サーバーで受信 (および直接応答) できますが、サーバーから「自由に」送信することはできません。送信用に作成したコードを次に示します。エラーを確認できる人はいますか? 以下のコードを見ると、私の handleSend ではすべて問題ないように見えます (メッセージは正しく見え、 t.Connection.SendAsync(completeArgs); が呼び出されますが、クライアント側には何も表示されません... (私が直接回答したものを除いて)得る...)
サーバーコード:
クライアントコード:
.net - SocketAsyncEventArgs を使用して、プロキシ経由でクライアントからサーバーにデータを中継する方法は?
複数のクライアントからの接続を受け入れるプロキシを開発しています。プロキシはクライアントからの有効なトークンをチェックし、トークンが見つかった場合、クライアントがサーバーに接続できるようにします。
このリンクからSocketAsyncEventArgs、BufferManager、およびその他の詳細を使用しています
コードは以下の通りです。
クライアントからの新しい接続を受け入れるためにacceptEventArgsを使用し、実際のサーバーに接続するためにconnectEventArgsを使用しています。受信したデータを acceptEventArgs (AcceptSocket) から connectedEventArgs (ConnectedSocket) に送信するにはどうすればよいですか?
//ソケットを受け入れた後のコード
private void ProcessAccept(SocketAsyncEventArgs acceptEventArgs) {
c# - SocketAsyncEventArgsと1秒あたりの受け入れ数が少ない
SocketAsyncEventArgsを使用していますが、1秒あたり数回の受け入れしか実行できません(理由はわかりません)。
1秒あたりの承認数を最大化するにはどうすればよいですか?Accept(null)を複数回呼び出す必要がありますか?
コード:リスニングソケットでListenを呼び出した後、Accept(null)を呼び出します。これが私のコードです。
c# - SocketAsyncEventArgs と、Socket への Async と Sync の混合呼び出し
saea.AcceptSocket.ReceiveAsync が完了した後に saea.AcceptSocket.Send を呼び出すことはできますか? (サエア == SocketAsyncEventArgs)
saea.AcceptSocket.Send を呼び出した後、再度 saea.AcceptSocket.ReceiveAsync を呼び出しても問題ありませんか?
実際には、受信を非同期にし、送信 (受信と比較して 1/10000) を同期にしたいと考えています。
c# - このシナリオで再利用するために SocketAsyncEventArgs をプールする価値はありますか?
私のシナリオでは、多くのクライアントの tcp ソケットがサーバーに接続されています。サーバーはすべてのソケットから ReceiveAsync() を呼び出し、コールバックがエラーなしで呼び出されると、受信したデータを解析します。1 つのソケットの受信データが特定のタイプのメッセージである場合、受信コールバックはループによって他のすべてのソケットに SendAsync() を実行し、その後、再度 ReceiveAsync() を開始します。そのため、1 つのソケットに対して、他の多くのレシーバーのコールバックによって SendAsync() が非常に短時間で呼び出される可能性があります。waitone セマフォによって Sendings を同期し、送信 IO が完了した後に 1 つのセマフォを解放して、ソケットごとに 1 つの SAEA obj のみを使用できるようにしましたが、これにより、送信ループで受信者のコールバック ブロックが発生する可能性があります。そこで、セマフォをキャンセルし、各ソケットの送信メソッド用にいくつかの SAEA オブジェクトをプールしました。
もう 1 つの質問は、再利用可能な SAEA をプールすると、SAES.Buffer がメモリのフラグメントを作成するかどうかです。SAEA をプールする前に SAEA.SetBuffer(null,0,0) メソッドを呼び出すことでメモリの問題を回避できますか?
c# - SocketAsyncEventArgs で 1 秒あたり 20 回の受信
TCP サーバーは SocketAsyncEventArgs を使用して開発され、Windows サービスとしての非同期メソッドです。Main の先頭に次の 2 行のコードがあります。
どちらも true を返します (戻り値はログに記録されます)。現在、2000 から 3000 のクライアントがこのサーバーにメッセージを送信し始め、接続を受け入れ始めます (接続の数を数えてみると、予想どおりです - 接続プールがあります)。サーバー プロセスのスレッド数は ~2050 から ~3050 に増加します。ここまでは順調ですね!
これで、ReceiveAsync が true を返した後、または SocketAsyncEventArgs の Completed イベントによって呼び出される Received メソッドがあります。
そして、ここから問題が始まります。どれだけ多くのクライアントが接続され、どれだけ多くのメッセージが送信されても、Received は 1 秒間に最大 20 回呼び出されます! クライアントの数が増えると、この数 (20) は最大 10 に減少します。
環境: TCP サーバーとクライアントは、同じマシン上でシミュレートされています。2 台のマシンでコードをテストしました。1 台には 2 コア CPU と 4GB RAM が搭載され、もう 1 台には 8 コア CPU と 12GB RAM が搭載されています。(まだ) データの損失はなく、各受信操作で複数のメッセージを受信することがあります。それはいいです。しかし、受信操作の数を増やすにはどうすればよいでしょうか。
実装に関する追加の注意事項: コードは大きく、さまざまなロジックが含まれています。全体的な説明は次のとおりです。新しい接続を受け入れるための単一の SocketAsyncEventArgs があります。それはうまくいきます。ここで、新しく受け入れられた接続ごとに、データを受信するための新しい SocketAsyncEventArgs を作成します。これ (受信用に作成された SocketAsyncEventArgs) をプールに入れました。再利用されることはありませんが、UserToken は接続の追跡に使用されています。たとえば、切断された接続や 7 分間データを送信していない接続は閉じられて破棄されます (SocketAsyncEventArgs の AcceptSocket はシャットダウンされ (両方)、閉じられて破棄され、SocketAsyncEventArgs オブジェクト自体も同様に破棄されます)。
udp - UDP の空のバッファー ReceiveAsync
このスレッドの SocketClient.cs を使用しましたが、msdn と非常によく似ています。
パケットを受信した後にバッファが空になる理由を誰か教えてもらえますか?
私はWindows 8でホストアプリケーションを使用しており、電話パケットから何らかの情報を送信しています。次に、ホストが新しいパケットで応答します。メソッド 'Receive' は空の情報を受け取ります。バッファが空です。それを修正する方法は?
c# - Windows Phone ソケットを使用して大きなファイルを受信する
ソケットを使用して、デスクトップ アプリケーションから Windows Phone アプリケーションにファイルを送信する作業を行っています。
私はデスクトップ ソケット サーバー アプリと Windows Phone アプリ (ソケット クライアント) を開発しました。どちらも 1MB 未満のファイルでうまく動作しています。つまり、1MB 未満のファイルをデスクトップ アプリから Windows Phone アプリに転送できます。
そして今、私の問題は大きなファイルを送信してアプリをクラッシュさせることです。アプリをデバッグしましたが、何度か繰り返した後にハングします。
Windows Phone 側でのファイル受信ロジックについては、以下のコード スニペットを確認してください。
コード :
早く返事をくれ...
ありがとう。