問題タブ [asyncsocket]
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.
iphone - アプリケーションがバックグラウンドで中断された状態で電話をロックした後、AsyncUDPSocketが壊れたパイプ
私はiPhoneアプリでAsyncUDPSocketサードパーティライブラリを使用していますが、ほとんどの場合、それはうまく機能します。AsyncUDPSocket
すべてのネットワークトラフィックに使用するのシングルトンインスタンスがあります。私のアプリはバックグラウンドで位置追跡用に登録されており、バックグラウンドで実行している間、ウェイクアップしてネットワーク経由で位置更新パケットを送信します。これはすべて、次の場合を除いて、バックグラウンド、フォアグラウンド、電話のロックまたはロック解除で大胆に実行されます。
- アプリを起動します
- アプリの設定で位置追跡を無効にします(バックグラウンドでウェイクアップしないようにします)
- ホームボタンを押します(アプリはバックグラウンドになり、ソケットはアプリの残りの部分と一緒に「フリーズドライ」されます)
- 電話をロックする
- 電話のロックを解除する
- アプリを再開
- 追跡を再開して、ソケットから何かを送信してみてください。試してみるとすぐに
SIGPIPE
/EPIPE
エラーが発生し、アプリがクラッシュします。
これに対処する最善の方法は、アプリケーションが終了し、バックグラウンドトラッキングが有効になっていないときはいつでもソケットを閉じて解放することだと思いましたが、試してみると、[socket close]
さまざまなエラーが発生します。私は開発チームにバグを報告しましたが、ここの誰かがエラーを完全に回避する方法、またはソケットを解放せずに存続させる他の方法についてアイデアを与えることができるかどうか疑問に思いました。ありがとう。[socket release]
AsyncUDPSocket
EXC_BAD_ACCESS
SIGPIPE
objective-c - CocoaAsyncSocket の読み取りデリゲートと書き込みデリゲートが起動せず、コードが整理されている
cocoaasyncsocket ライブラリに付属するエコー サーバーの例の修正版を使用して、次のことを実行しようとしています。
1) サーバーとして機能する Python スクリプトへの接続を開く
2) データを送信する // 機能するが、デリゲートは起動しない
3) データを受信する // デリゲートは起動しない
4) 切断する // 明らかに切断しないまだ私のスレッドに
現在、didFinishLaunchingWithOptions デリゲートで接続を開き、didConnectToHost デリゲートでデータを送信しようとしています。次に、クライアントから返されたデータを読み取ってから切断しようとします。
接続を開いてデータを送信することはできますが (サーバーが受信したことを確認します)、didWriteDataWithTag デリゲートは起動しません。ただし、サーバーはデータを受信します。次に、サーバーはいくつかのデータを起動しますが、didReadData も起動しません。
読み取り/書き込みデリゲートが起動しないという事実に加えて、コードを整理する方法が正しくないようですが、実行ループとは対照的に、イベント駆動型システムでこれがどのように見えるかはわかりません (I'イベント駆動型のもの + ネットワーキングの初心者です)。それぞれの完了がデリゲートによってトリガーされる一連のアクションがある場合、デリゲートは何らかのメッセージを共有する必要がありますか?つまり、「xxx」メッセージを受け取り、「yyy」と書き戻しますか? これらすべてを管理する 1 つの関数が必要です。これを行う標準的な方法はありますか?
IPhoneConnectTestAppDelegate.m (スニペット)
tcpserver.py
asyncsocket - すべての場合に EndRead() を呼び出す必要がありますか?
(双方向) NetworkStream を使用した非同期 IO に関連して、MSDNは、「BeginRead を呼び出すたびに、EndRead を 1 回呼び出す必要がある」と述べています。
BeginRead() が発行された後に NetworkStream が閉じられた場合など、EndRead() が例外をスローする場合でも、これは当てはまりますか?
例外のスローのオーバーヘッドは必要ありませんが、BeginRead() によって予約された OS の貴重なリソースをリークしたくありません。
また、ストリームの状態のテストと条件付きの EndRead() の間でストリームを閉じることができることも知っていますが、ストリームが閉じていることがわかっているときに EndRead() を省略できる場合、大部分のケースで例外処理を節約できます。 .
私はそれを間違っていますか?
ありがとう!
c# - Windows Server 2008 R2で非同期ソケットを使用すると、CPU使用率が100%になります
私は、ソケットクラスの非同期メソッド(BeginAccept()、BeginReceive()など)を使用するかなり汎用的なC#ソケットサーバーを持っています。このサーバーは、WinServer2003を実行している多くの顧客サイトで過去4年間うまく機能しています。 Windows Server 2008 R2サーバー、64ビットにインストールしました。最初のクライアントが接続し、acceptハンドラーでBeginReceive()およびBeginAccept()呼び出しを発行するまで、すべてが正常に見えます。これが発生すると、CPU使用率が100%に急上昇し、リスニングソケットを閉じるまでその状態が続きます。
重要かどうかはわかりませんが、サーバーは仮想マシンで実行されています。
多くのテストを行いましたが、何も役に立たないようです。Process Explorerを使用すると、BeginReceive()/ BeginAccept()呼び出しの直後に2つのスレッドがスピンアップし、それらがプロセッサーを消費していることがわかります。残念ながら、Win764ビットワークステーションではこの問題を再現できません。
私は多くの調査を行いましたが、これまでに見つけたのは、Server2008R2でTCP/IPコンポーネントに問題がある可能性があることを示唆する、次の2つのKB記事ですが、これらはホットフィックスとしてのみ入手可能です:KB2465772およびKB2477730。問題が解決することが確実になるまで、顧客にインストールしてもらうのは気が進まない。
他の誰かがこの問題を抱えていましたか?もしそうなら、あなたはこの問題を解決するために何をしなければなりませんでしたか?
これが状況を引き起こすと私が信じる方法です:
tcp - ネーグルのような問題
だから私はこのリアルタイムゲームを持っています。SFMLライブラリを使用してnagleを無効にしたC++サーバーと、asyncsocketを使用したクライアントもnagleを無効にします。1秒ごとに30パケットを送信しています。クライアントからサーバーへの送信に問題はありませんが、サーバーからクライアントへの送信時に、一部のパケットが移行しています。たとえば、「a」と「b」を完全に異なるパケットで送信している場合、クライアントはそれを「ab」として読み取ります。それは一度だけ起こりますが、それはゲームで本当の問題を引き起こします。
だから私は何をすべきですか?どうすればそれを解決できますか?多分それはサーバーの何かですか?たぶんOSの設定?
明確にするために:私はnagleを使用していませんが、まだこの問題があります。クライアントとサーバーの両方で無効にしました。
c# - ソケットプログラミング:サーバー
さて、私は自分自身にいくつかのソケットプログラミングを教えようとしてきました。私は非同期サーバーを使用して小さなC#アプリケーションを作成しましたが、次の点を除いて、ほとんどのことを理解しています。
したがって、サーバーには接続をリッスンするポートがあり、接続を受信すると、通信を行うための別のソケットを作成します。これは私が理解していないことです...理論的にはクライアントがこの新しい接続にどのポートが選択されているかわからない場合、クライアントとサーバー間の通信はどのように行われますか?
すべての回答をありがとう
編集:リスニングスレッドがデフォルトのポートでリッスンしていることを理解している限り、すべてのメッセージはクライアントごとに異なるソケットで処理されますか?
もう一度編集してください:皆さんが私の質問をどのように誤解しているのか。通常のソケット通信を理解しています。私の問題は、リスニングソケットが接続ソケットとは異なる非同期サーバーにあります。つまり。
- サーバーはデフォルトポートでリッスンします
- クライアントは接続を試みます。
- サーバーレシーバー要求。
- 次に、サーバーはクライアントとサーバーの間に通信ソケットを作成し、デフォルトのポートでリッスンを続けます。
私の問題は最後のステップです。クライアントは、新しいソケットで通信する方法をどのようにして知ることができますか?ここにいくつかのサンプルコードがあります http://msdn.microsoft.com/en-us/library/5w7b7x5f.aspx
c# - Control.Invokeメソッド後の非同期ソケット送信の問題
非同期ソケットを使用するクライアント/サーバーアプリケーションがあります。サーバー側からクライアントにデータを送信する方法があり、クライアントはこのデータを処理してクライアントのフォーム制御を制御する方法を持っています。
非同期ソケットを使用しているため、Control.Invoke
メインスレッドにアクセスするためのメソッドを使用する必要があります。しかし、問題が発生しました。使用するControl.Invoke
と、サーバー側へのデータ送信の問題が発生します。それはsocketClient.Send(byteArray);に入ります。ただし、サーバーにデータを送信しません。Invoke.Methodを使用しない場合、クライアント側のフォームコントロールを制御できません:(
私がしなければならないこと?
問題は見つかりましたが、Controlに関するものではありません。ソケットデータ送信の問題を呼び出しますが、解決できませんでした。socketClient.Send()メソッドを繰り返し使用すると、最初のsocketclient.Send()のみが機能します。これが私のコードです;
//クライアントが接続されている場合、このメソッドは機能しています。
//クライアントがサーバーにメッセージを送信したとき、このコードブロックは機能しています。
//このメソッドはクライアントのメッセージを処理しています
//このコードブロックはクライアント側から機能しており、問題はここから始まります。2つのSendメソッドが機能していますが、サーバーでは最初のメソッドのみが実行されます。
c# - C# NetworkStream による非同期読み取りと書き込み
クライアントからリクエストを受信し、リクエスト タイプに応じたレスポンスを返すサーバーを構築しました。リクエスト タイプがストリーミングの場合、サーバーはデータ配列を送信する必要があります。サーバーがデータをストリーミングしている間、クライアントは停止要求を送信してストリーミングを停止する場合があります。要求と応答が同じ TCP 接続で転送される場合、サーバーは、すべてのデータがクライアントへのストリーミングを終了したときにのみ停止要求を受信します。この問題を解決するには、非同期書き込みを使用する必要があると思います。これは私のコードです:
最初に、クライアントからの接続を受信するためのループ バックを作成します。
ClientInteraction クラスの In Process 関数:
HandleRequest 関数では、リクエストが STREAM の場合、配列内のデータをクライアントに送信します。
このコードで、クライアントに接続し、データをクライアントに送信します。しかし、すべてのデータがストリーミングされるまで、停止要求を受信できません。私の問題を解決する正しい方法を教えてください。ありがとうございました。
c# - メッセージを受信するとサーバーアプリケーションが閉じます
さて、私はクライアントサーバーアプリケーションを作成していて、クライアントにメッセージをうまく送信できますが、逆に(クライアントからサーバーへ)サーバーアプリケーションを閉じると、これを修正する方法について何か助けがありますか?
いくつかのブレークポイントを実行した後、この部分に到達した後、textAreaに追加しようとすると、エラーなしで閉じることに気付きました。
これを修正する方法について何かアイデアはありますか?スレッドと関係があると思いますが、なぜ閉じるのかわかりません。