問題タブ [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 投票する
2 に答える
2467 参照

.net - .NET 非同期ソケット: このシナリオでは、Begin/End よりも SocketAsyncEventArgs の利点はありますか?

Socket には、.NET 3.5 以降、SocketAsyncEventArgs (例: Socket.SendAsync() ) で使用するこれらの新しい非同期メソッドがあり、内部で IO 完了ポートを使用し、割り当てを維持する必要がなくなるという利点があります。

StartSendCompletedイベントだけの単純なインターフェイスを持つUdpStreamというクラスを作成しました。送信用と受信用の 2 つの SocketAsyncEventArgs を割り当てます。StartSend は、SendAsync を使用して単純にメッセージをディスパッチし、1 秒間に約 10 回呼び出されます。受信 SocketAsyncEventArgs で Completed イベントを使用し、各イベントが処理された後、すべての ReceiveAsync で受信ループを形成します。ここでも、1 秒あたり約 10 回受信しています。

私たちのシステムは、これらのUdpStreamオブジェクトを最大500 個サポートする必要があります。つまり、サーバーは 500 の異なる IP エンドポイントと同時に通信します。

MSDN SocketAsyncEventArgs の例では、一度に処理する未処理の受信操作ごとに 1 つ、N x SocketAsyncEventArgs を割り当てることに気付きました。これが私たちのシナリオにどのように関係するのか正確にはわかりません.エンドポイントごとに 1 つを割り当てているだけなので、おそらく SocketAsyncEventArgs の利点が得られていないように思えます. 最終的に 500 receive SocketAsyncEventArgs になった場合、何のメリットもないと思います。おそらく、まだ IO 完了ポートの恩恵を受けているのでしょうか?

  • この設計は、500 にスケーリングするときに SocketAsyncEventArgs を正しく使用しますか?

  • 単一の「UdpStream」を使用している場合、SocketAsyncEventArgs と古い Begin/End API を使用する利点はありますか?

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

c# - SocketAsyncEventArgs.UserToken が更新されていませんか?

現在、Silverlight クライアントと .NET サーバーを含むクライアント サーバー アプリケーションを使用しています。.NET 部分は System.Net.Sockets 名前空間で提供される Tcp クラスを使用しますが、Silverlight クライアントは raw ソケットを使用します。私のニーズに合わないため、現在 HttpListener クラスを使用しているコードからこれに移植しています。ただし、Http クラスには SL 側で Begin* および End* スタイルの非同期メソッドを使用する機能があり、操作が完了したらハンドラーを指定できます。これを新しいシステムで動作させるのに問題があります。私の現在の戦略は、ハンドラーを UserToken の一部として含めることです。ただし、このトークンは更新されていないようです。

ここにいくつかの編集されたコードがあります。2 つの側を相互に通信させることはできますが、正しい UserToken が送信されていないようです。

上記のコメントが示すように、ProcessReceive では、userToken.Test は常に "foo" であり、userToken.Handler は常に null です。

これまで ProcessSend に侵入できなかったため、実際に送信された SocketAsyncEventArgs を確認できません。このイベントが発生しない理由を知っている人はいますか (送信後に完了)? SendToServer 関数を台無しにしていませんか?

同期などには他にも既存の問題がある可能性があることは承知していますが、それはここの問題ではないと思います。私が試したことの1つは、ManualResetEventを設定して、接続が完了する前に誰もサーバーにデータを送信しないようにすることでした(ProcessConnect)が、それでも問題は解決しませんでした.

どんな助けでも大歓迎です!

編集:これが発生する理由は、ProcessConnect 関数で ReceiveAsync を呼び出すと、サーバーがデータの応答を送り返すときに使用されているためです。したがって、UserToken "foo" がハンドラーに存在します。次にサーバーがデータを送信するとき、ReceiveAsync は UserToken "bar" で引数を使用します。したがって、二重通信ビットについては、一種の同期が取れていません。クライアント側から送信した SocketAsyncEventArgs が、応答で使用されるものと同じであることを保証できません。唯一の解決策は、SL クライアントに 2 つのソケット (1 つはサーバーが開始したデータ用、もう 1 つはクライアントが開始した要求用) を開くことです。ただし、これは二重の性質を利用していないことを意味します。

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

c# - 送受信データを処理するC#SocketAsyncEventArgs

C# で「SocketAsyncEventArgs」クラスを理解しようとしています。http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx

私はこのチュートリアルに従っています: http://www.codeproject.com/Articles/83102/C-SocketAsyncEventArgs-High-Performance-Socket-Cod

今、私は自分のサーバーでデータを正確に処理する方法にこだわっています。私がやろうとしているのは、接続されたクライアントに SocketAsyncEventArgs を使用し、BufferManager で 512 バイトの割り当てられた Buffer スペースを使用することです。次に、バイト [] データを、デコードおよび読み取り用のバイト [] を保持する独自のカスタム クラス (ClientPacket) にデコードします。

これで問題ありませんが、サーバーが常にデータで応答するとは限りません。質問は次のとおりです。

受信に 1 つの SocketAsyncEventArgs を使用し、ループして受信データを処理し、送信する必要があるときはいつでもプールから SocketAsyncEventArgs を割り当て、完了時にそれを返しますか?

また、読み込みが完了したことを SocketAsyncEventArgs はどのように知るのでしょうか? (新しいデータで上書きする前にbyte []バッファで終了したとき)応答しない場合、終了時にどのようにプールに返されるのですか?

0 投票する
3 に答える
21338 参照

c# - Socket.SendAsync を使用して大きなデータを送信する方法

このコードは MSDN から変更されています

なぜ流通しているのかs.SendAsync(e)、2回目に実行するとエラーになる

例外: この SocketAsyncEventArgs インスタンスを使用して、非同期ソケット操作が既に進行中です

大きなデータを送信するにはどうすればよいですか?

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

c# - SocketAsyncEventArgs との非同期ソケット通信のタイムアウト

私は SocketAsyncEventArgs を使用して、何百もの機器 (ほとんどは GPRS 経由) と通信しています。ドキュメントには、タイムアウト オプション (つまりSocketOptionName.SendTimeout ) が非同期通信では機能しないと記載されているため、応答を停止するものもあり、操作をタイムアウトにする方法がないようです。

Send/Receive/ConnectAsync の実行時にタイムアウトをチェックする方法を探しています。スレッドをブロックしてはいけません (したがって、someMonitor.WaitOne(SomeTimeoutValue) を呼び出しても実行されません)。また、操作ごとにタイマー インスタンスを作成したくありません (機器の数が確実に増加するため)。

これに関するヒントはありますか?

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

c# - SocketAsyncEventArgs? - 簡単な例

私の XNA TopDown Shooter ゲームの進歩が続くにつれて、マルチプレイヤー機能を実装する時が来ました。クライアントとサーバーは毎秒大量のデータ (位置、回転、その他のプレイヤー データを含む毎秒 60 パケット) を処理する必要があるため、安定した高速ネットワーク システムを作成する必要があります。

私の質問: 1 つのサーバーと複数のクライアントの間で非常に高速で高性能なネットワーク接続を作成するための最良のオプションは何ですか? 答えが SocketAsyncEventArgs である場合、インターネット上のどこかに、この高度なクラスを使用してデータを送受信する方法の単純でクリーンな例を知っていますか? 私が理解している良い例が見つからないようです。

御時間ありがとうございます!

バス

0 投票する
0 に答える
638 参照

windows-phone-7 - Windows Phone 7 クライアント サーバーの実装

クライアントとして機能し、Java で記述されたサーバーに要求を送信する Windows Phone 7 用のアプリケーションを作成しようとしています。クライアントはリクエストを送信し、サーバーからの応答を待つ必要がありました。私の問題は、サーバーと適切に通信できないように見えることです。シンプルな .NET C# プログラムでテストして、socket.send() や socket.receive() などのブロッキング呼び出しを使用すると、動作しますが、Windows Phone アプリケーションにはブロッキング呼び出しがありません。サーバー (Java) が接続を検出すると、次のようになります。

これがクライアント(C#)の実装方法です。

次の行に問題があります: socket.SendToAsync(sendListener); 何もせずにプログラムを終了する C# 側 (リターン コード 0 で終了)。Javaサーバーは接続を検出するとすぐに動作を開始するため、問題が発生する可能性がありますか? コミュニケーションを機能させるにはどうすればよいですか?

0 投票する
4 に答える
1357 参照

c# - 非同期接続を介してメッセージの一部だけでなく完全なメッセージを取得する方法

Javaで作成した別のサーバーへの非同期接続と通信するこのC#クライアントを実装しました。これはクライアントです:

サーバーから長いメッセージを取得するにはどうすればよいですか?クライアントがより多くのデータを読み取って、実際にメッセージ全体を読んだかどうかを確認するには、何を変更する必要がありますか?行に問題がある可能性があるためstring dataFromServer = Encoding.UTF8.GetString(e.Buffer, 0, e.BytesTransferred);、メッセージの全体ではなく、メッセージの一部のみを受信します。

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

c# - SocketAsyncEventArgs を使用してデータを順番に送信する

データを送信するときに最初に競合状態が発生しました。問題は、複数の SocketAsyncEventArgs を使用してデータを送信できるようにしていたことでしたが、最初のパケットは 2 番目のパケットの前に完全には送信されませんでした。すべてのデータが送信されるまでループするバッファに収まらず、最初のパケットが小さい 2 番目のパケットよりも大きかったため、2 番目のパケットが送信され、最初のパケットの前にクライアントに到達しました。

データの送信に使用するオープン接続に 1 つの SocketAyncEventArgs を割り当て、セマフォを使用してアクセスを制限し、完了したら SocketAsyncEventArgs コールバックを行うことでこれを解決しました。

すべてのデータが送信され、次の送信の準備が整ったときにコールバックされるため、これは正常に機能します。これに関する問題は、開いている接続にデータをランダムに送信したいときにブロックが発生し、大量のデータが送信されてスレッドがブロックされることです。

私はこれに対する回避策を探しています。データの送信が要求されたときにキューを作成することを考えました。パケットをキューに追加し、1 SocketAsyncEventArgs を単純にループしてそのデータを送信します。

しかし、スケーラブルでありながらこれを効率的に行うにはどうすればよいでしょうか? リクエストされた順序でパケットを送信している間は、できるだけブロックを避けたい.

どんな助けにも感謝します!

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

c# - SocketAsyncEventArgsでBufferListを使用し、SocketError InvalidArgumentを取得しない方法は?

私はSocketAsyncEventArgsでSetBufferをうまく使うことができます。

(SetBuffer(null、0、0)を実行した後)BufferListを使用しようとすると、ソケットでSendAsyncを実行すると、常にすぐにSocketError InvalidArgument(10022)が発生します。

BufferListの使用方法に関する例やドキュメントはなく、私が行っていることは(とにかく私には)理にかなっています。

誰かがサンプルプログラムやコードスニペットを指摘できますか?

私はこれで髪を引き裂いていて、あまり残っていません...

これが基本的に私が行っていることです(eはSocketAsyncEventArgsであり、lSocketはSetBufferに使用するのと同じソケットです)