問題タブ [beginreceive]
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.
sockets - Is Socket.BeginReceive(IList> バッファ.. 非同期ではありませんか?
私は次のカスタムクラスを実装しようとしています:
これはソケットに渡され、そのソケットからデータを受信するためのバッファとして使用されます。
テスト中に私は呼び出し時にそれを発見しました
BeginReceive(IList..
ブロックする!? これを BeginReceive(byte[]... に置き換えると、非同期で動作します。
他の誰かがこれに出くわしましたか?
必要に応じてテストコードを投稿しますが、この質問を醜くする前に誰かから聞いてみたいです:)
ありがとう!
c# - C#Socket.BeginReceive / EndReceive
Socket.BeginReceive / EndReceive関数はどのような順序で呼び出されますか?
たとえば、BeginReceiveを2回呼び出します。1回目はメッセージの長さを取得し、2回目はメッセージ自体を取得します。これで、シナリオは次のようになります。送信するすべてのメッセージについて、完了を待ち始めます(実際には、送信されたメッセージの確認応答です。また、確認応答を受信した後、アクションの完了を待ちます)。したがって、BeginSendごとにBeginReceiveを呼び出します。 BeginReceiveのコールバックごとに、長さまたはメッセージを受信しているかどうかを確認します。メッセージを受信して完全に受信した場合は、別のBeginReceiveを呼び出しますアクションの完了を受け取ります。今、これは物事が同期しなくなるところです。私の受信コールバックの1つは、実際にはメッセージ自体であるにもかかわらず、メッセージの長さとして解釈されるバイトを受信しているためです。
どうすれば解決できますか?
編集:これはC#.NETの質問です:)
これがコードです、基本的には大きすぎます、ごめんなさい
c# - 非同期HttpWebResponse読み取り中に未処理のSocketExceptionをキャッチします
HttpWebRequest.BeginGetResponse / EndGetResponseおよびHttpWebResponse.GetResponseStream()。BeginRead / EndReadへのすべての非同期呼び出しは、try / catchブロックから行われますが、これらの例外は伝播し、それらを処理してアプリケーションの終了を停止する機会を残しません。
未処理の例外:System.IO.IOException:トランスポート接続からデータを読み取れません:確立された接続が、ホストマシンのソフトウェアによって中止されました。---> System.Net.Sockets.SocketException:確立された接続がホストマシンのソフトウェアによって中止されました
未処理の例外:System.IO.IOException:トランスポート接続からデータを読み取れません:既存の接続がリモートホストによって強制的に閉じられました。---> System.Net.Sockets.SocketException:既存の接続がリモートホストによって強制的に閉じられました
実際のコードフラグメント:
PS:バグレポートがMicrosoftConnecthttps://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=510564に提出されました
c# - 2 つの Socket.BeginReceive 呼び出しの間の TCP パケットはどうなりますか?
ソケットプログラミングについて疑問があります。TCP パケット スニファーを開発しています。Socket.BeginAccept、Socket.BeginReceive を使用してすべてのパケットをキャプチャしていますが、パケットが受信されたときに何かを処理する必要があります。これは高速な操作ですが、数ミリ秒かかるため、もう一度 BeginReceive を呼び出します。
私の質問は、処理中にいくつかのパケットが送信され、BeginReceive を呼び出していない場合はどうなるかということです。パケットは失われていますか、それとも内部でバッファリングされていますか? 制限はありますか?
asynchronous - BeginReceive / BeginRead タイムアウト
私は NetworkStream と TcpClient を使用して、BeginRead を使用してデータを非同期に受信しています。指定した時間が経過すると読み取りが中止されるように、この操作にタイムアウトを適用する必要があります。
私が知る限り、これは NetworkStream または TcpClient ではサポートされていません - ReceiveTimeout プロパティがありますが、これは同期に相当する「読み取り」にのみ適用されるようです。
基になる Socket クラスでさえ、その BeginReceive メソッドでタイムアウトをサポートしていないようです。
この問題について検索したところ、タイムアウト期間内に操作が完了しない場合に操作をキャンセルする別のバックグラウンド スレッドをセットアップするという唯一の解決策が提案されました。これは恐ろしいハックのようです。きっともっと良い方法がありますか?
c# - UdpClient.BeginReceive をループで使用する方法
やりたい
しかし、 を使用する代わりに、 をUdpClient.Receive
使用する必要がありますUdpClient.BeginReceive
。問題は、どうすればいいですか?を使用したサンプルは多くなくBeginReceive
、MSDN の例はまったく役に立ちません。を使用する必要がBeginReceive
ありますか、それとも別のスレッドで作成する必要がありますか?
私は一貫してObjectDisposedException
例外を受け取ります。送信された最初のデータのみを取得します。次のデータは例外をスローします。
何を与える?
ちなみに、一般的な考え方は次のとおりです。
- tcpclient マネージャーを作成します。
- udpclient を使用してデータの送受信を開始します。
- すべてのデータが送信されると、tcpclient マネージャーは受信者にすべてのデータが送信されたことを通知し、udpclient 接続を閉じる必要があります。
c# - .NET 非同期 MSMQ
これがどこで間違っているのかわかりません。基本的に、メッセージキューから受信してメッセージを処理するプログラムがあります。プログラムはいつでも停止できます。その場合、メッセージ ループは、プログラムが終了する前に処理を終了します。私は次のコードでこれを達成しようとしています:
おわかりのように、Stop メソッドはメッセージ キューを破棄し、アイドル状態の待機ハンドルが設定されるのを待ちます (これは、破棄時に ReceiveCompleted イベントが呼び出されるときに発生するはずですが、e.Message プロパティは除外する必要があります)。
ただし、メッセージ ループは続きます。メッセージ キューを破棄しましたが、メッセージ キューからの読み取りは引き続き行われ、例外ハンドラーは呼び出されません。つまり、idle.Wait 行は永久に待機します。
私の理解では、メッセージ キューを破棄すると、保留中の受信を終了してイベントを呼び出す必要がありますが、e.Message (または q.EndReceive) は例外をスローする必要があります。そうではありませんか?そうでない場合、他にどうすれば安全にメッセージ ループを終了できますか?
ありがとう
アップデート:
完全な例を次に示します (キューが存在すると仮定します)。
c# - WebClient.Upload と Socket.BeginReceive の問題
私は現在、単純な Web サーバーとそれを使用するいくつかのクライアントを作成しています。私の顧客は、今後のソリューションの機能を拡張して Web クライアントを含めたいと考えていますが、通信を細かく制御する必要があるため、単純な Web サーバーがソリューションになります。
とにかく、2 つの症状があり、一連の単体テストを実行することで両方を 100% 再現できます。「POST」コマンドを使用して単純な文字列をサーバーにアップロードすると、問題が発生します。現実にはやらないけど、何が起きているのか分からないと前に進めない。BinaryFomatter を使用して、文字列 "Hello World!" を単純にシリアル化する単体テストがあります。結果のバイト配列データの前に、ストリーミング データの長さを示す整数を付けます。確かに非常に単純なプロトコルですが、他のすべての状況 (主に大きなオブジェクト グラフ) では問題なく動作します。2 つのシナリオがあります。
- 非常に短い文字列 (「Hello World!」) をアップロードします。
- 大きな文字列 (数千文字) をアップロードします。
最初に他の単体テストを実行せずにその単体テストを実行すると、これは期待どおりに機能しますが、すべての単体テストを実行するたびに、これは常に 2 つの異なる方法で失敗します。
- 短い文字列は、受信ソケットをトリガーして受信するようには見えません。具体的には、Socket.BeginReceive() を呼び出すと、コールバックが呼び出されません。
- 長い文字列は期待どおりに受信をトリガーしますが、ストリームは破損します。長さのプレフィックス (4 バイト、シリアル化された Int32) に非常に大きな値が含まれています。確かに正しいものではありません。
これは、サーバー コードの興味深い部分です。
私はここで間違った結論を導き出しているかもしれませんが、オブジェクト グラフのストリーミングでは何の問題も見たことがありませんが、シリアル化された文字列で同じことを行うのは問題があります。理由がわかりません。私を正しい方向に向けるヒントがあれば幸いです。
編集
この問題は以前のテスト ケースが原因で発生したようで、最初に疑った文字列の送信とは関係ありません。2 つの連続するアップロードの間にデータが「残る」方法はありますか? ただし、クライアントソケットはアップロードごとに再作成されます。
これは、アップロードのクライアント側です。
乾杯
/ジョナス
c# - MessageQueue BeginReceive() メソッドが 2 回呼び出されました
BeginReceive()
メソッドを 2 回 (次々と) 呼び出すとどうなりますか?
例:
助けてください
thnx:D
c# - メッセージを処理するIOCPスレッドとスレッドプール
BeginReceive/EndReceive を使用してソケット IO を処理している場合、コールバックは IOCP スレッドによって呼び出されます。
受信が完了したら、データを処理する必要があります。
- コールバックの呼び出しスレッドでそれを行う必要がありますか?
- または、ThreadPool.QueueUserWorkItem を使用してタスクを実行する必要があります
通常、サンプルはコールバック スレッドで作業を行いますが、これは少し混乱します。
数百のアクティブな接続を扱っている場合、IOCP スレッドで処理を実行すると、数百のスレッドを持つプロセスになります。ThreadPool は同時スレッドの数を制限するのに役立ちますか?