問題タブ [disconnect]
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 - NetworkStreamクラスの使用中にクライアントのTCP切断を検出する
私の友人が問題を抱えて私に来ました。接続のサーバー側でNetworkStreamクラスを使用しているときに、クライアントが切断すると、NetworkStreamはそれを検出できません。
分解すると、彼のC#コードは次のようになりました。
クライアントが正常に接続でき、サーバーが送信されたデータを読み取ることができるという点で、コードは機能します。ただし、リモートクライアントがtcpClient.Close()を呼び出す場合、サーバーは切断を検出しません。client.Connectedはtrueのままであり、ns.DataAvailableはfalseです。
Stack Overflowを検索すると、答えが得られました。Socket.Receiveが呼び出されていないため、ソケットは切断を検出していません。けっこうだ。これを回避できます。
(簡潔にするために、例外処理コードは省略しました。)
このコードは機能しますが、私はこのソリューションを「エレガント」とは呼びません。私が知っている問題に対する他の洗練された解決策は、TcpClientごとにスレッドを生成し、BinaryFormatter.Deserialize(nee NetworkStream.Read)呼び出しをブロックに許可することです。これにより、切断が正しく検出されます。ただし、これには、クライアントごとにスレッドを作成および維持するオーバーヘッドがあります。
元のコードの明快さを維持する秘密の素晴らしい答えが欠けているように感じますが、非同期読み取りを実行するために追加のスレッドを使用することは避けてください。ただし、おそらく、NetworkStreamクラスはこの種の使用法のために設計されたことはありません。誰かが光を当てることができますか?
更新: .NET FrameworkにNetworkStreamのこの使用(つまり、ポーリングとブロッキングの回避)をカバーするソリューションがあるかどうかを確認することに関心があることを明確にしたいだけです-明らかにそれは可能です。NetworkStreamは、機能を提供するサポートクラスに簡単にラップできます。フレームワークでは、NetworkStream.Readでのブロックを回避するためにスレッドを使用する必要があるか、ソケット自体を覗いて切断をチェックする必要があるのは奇妙に思えました。これはバグのようです。または、機能が不足している可能性があります。;)
networking - データがない場合の TCP 切断
TCP プロトコル Wiki をチェックアウトしましたが、長期間データが転送されない場合にソケット接続がタイムアウトするかどうかはわかりませんでした。つまり、物理的な問題は発生しませんが、2 台のコンピューターは、しばらくの間、互いに送信するデータがありません。どのように接続がまだ存在しますか?壊れていないことを理解するのに役立つ低レベルのデータ転送はありますか?
ありがとうございました!質問がばかげている場合は申し訳ありません..
android - Android で HttpURLConnection の切断が機能しない
メソッドの接続解除元がHttpURLConnection
正しく機能していないようです。次のコードを実行すると:
IllegalStateException
メソッドを呼び出すとが得られsetDoInput
ます。例外は言う:
接続済み
java - クライアントがjettyサーバーから切断されたことを検出します(継続を使用)
Jetty継続を使用していますが、クライアントがサーバーから切断された(jettyサーバーへの接続が閉じられた)ことを検出できるかどうか疑問に思いました。
ありがとう、アルフレッド
winapi - 名前付きパイプクライアント/サーバーを使用してクライアントの切断を検出するにはどうすればよいですか?
私は名前付きパイプについて学び、MSDNドキュメントの名前付きパイプクライアントとサーバーの例で遊んでいました。
クライアントを変更して、コンソールにメッセージを入力し、サーバーに送信してメッセージを表示し、返信を返すようにしました。基本的に、SetNamedPipeHandleState()呼び出しの後に開始し、CloseHandle()呼び出しの前に終了するループを追加しました(つまり、開閉はループの外側で発生するため、ループ内で同じパイプハンドルを使用しています)。
私の質問は、クライアントを(クライアントを閉じるか、タスクマネージャーを介して終了することによって)強制終了した場合、サーバー側が切断を検出する方法はありますか?
GetNamedPipeHandleState()を使用して失敗を返し、GetLastError()を呼び出すとERROR_PIPE_NOT_CONNECTEDが返されることを期待してみましたが、そうではありませんでした。このサーバーの設定方法が原因で、CompletedReadRoutine関数でこれを実行し、「制御された」障害を作成する必要がありました。私がしたことは、サーバーのCompletedReadRoutineにブレークポイントを設定することでした。
- サーバーを起動しました
- クライアントを開始しました
- クライアント経由でメッセージを送信しました(ここでサーバーのブレークポイントにヒットします)
- クライアントを殺した
- GetNamedPipeHandleStateにステップスルーしました
GetNamedPipeHandleState()の呼び出しは正常に返されるため、GetLastError()の呼び出しを行う必要はありません。WriteFileEx呼び出しに到達すると失敗し、その時点でGetLastErrorを呼び出すとERROR_NO_DATAが返されます。
パイプ関数を見ると、ここで役立つ可能性のあるものは他にありません。何かが足りないか、クライアントの切断が検出されないだけです。
私が考えることができる他の唯一のことは、接続しているクライアントのpidを(GetNamedPipeClientProcessIdを介して)収集し、ウォッチドッグスレッドをスピンオフして、それらがまだ生きているかどうかを確認することです。とはいえ、そうすることを考えるだけで、私のスパイダーマンの感覚が失われます。
名前付きパイプを使用しているときに切断されたクライアントを検出する方法はありますか?
php - php - 複数のデータベースの切断と接続
ループを介して現在のデータベースから複数のデータベースに切り替えられるようにしたい:
他のデータベースからの詳細を挿入および更新しますが、現在のユーザーデータベースからのデータも挿入および編集しますが、これは望ましくありません。何か案は?
c# - Javaソケット切断レポートとC#切断
C#では、ソケット接続が終了すると、リンクを終了する前に他のノードにこのことが通知されるため、残りのノードは接続ステータスを更新できます。
Javaでは、通信リンクを終了すると、他のノードが接続を有効として報告し続けます。
読み取り中に-1を受信したときに接続が失われたことを報告する読み取りサイクル(理にかなっている)を実装する必要がありますか(C#ではこれは0だと思います)?
あなたの洞察力に感謝します。
編集:あなたの両方に感謝します。私が疑って私の投稿で述べたように、接続の接続状態を確認するには追加のチェックが必要です。
java - enterprisedt の ftp Java フレームワークを使用して disconnect() を呼び出すと、接続がリセットされる
enterprisedt Java ftp フレームワークを使用して、ftp サーバーから切断できません。
FileTransferClient オブジェクトで disconnect() を呼び出しても、エラーが発生することはありません。
サーバーに接続してから切断する以外は、何もしません。
これを実行すると、ログに次のように表示されます。
そしてスタックトレース:
現在の作業ディレクトリ内のファイルのリストを取得するなど、問題なくサーバーに接続して何かを行うことができることに注意してください。しかし、なぜか切断できない!アクティブモードとパッシブモードの両方を使用してみました。
上記の例は、ちなみに独自の例からコピー/貼り付けしたものです。Google 検索を行っても、これに関連するものは何も見つかりません。そのため、この問題に関する提案や経験があれば幸いです。
error-handling - WCF net.tcp サーバーの切断 - クライアント側で適切に処理するには?
私は今、ちょっと厄介な問題に悩まされています。Silverlight 4 アプリケーションを持っています (デフォルトで OOB を実行します)。サーバーとの通信手段として、net.tcp で WCF を使用します。クライアントは、wcf クライアント プロキシの中央インスタンスを使用します。すべてがサーバー側で実行されている限り、すべて問題ありません。
すべての途中でサーバーを強制終了すると、クライアント側で雪崩のような例外が発生します (接続の切断、チャネルの障害など)。
今、私はこれをクリーンで一元化された方法で処理する方法を探しています (一元化が可能な場合)。
SL アプリには、App.cs (public static MyClient Client { get;set;}) にある 1 つの中央クライアント オブジェクトがあり、アプリケーションの開始時に初期化されます。
クライアントオブジェクトの接続の問題を適切に処理する方法はありますか?
c# - Bluetooth デバイスを切断するにはどうすればよいですか?
Bluetooth 経由でコンピュータにアクティブに接続されているデバイスがあります。C#.NET アプリケーションからデバイスを切断して、コンピューターがデバイスに接続されないようにしたいと考えています。
どうすればこれを行うことができますか?
適切なソケットを見つけてそのソケットを切断することと関係があると思いますか? (しかし、私はソケット接続について何も知らないので、これは純粋に推測です。)
何か案は?