問題タブ [half-close]
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 - socket: ハーフクローズ時に常に POLLHUP が発生する
Linux で動作するソケット サーバーを作成しましたが、これはおそらく Linux 固有のものではありません。
poll()
クライアントの状態を確認するために使用します。私のクライアントは、リクエストを送信した後、アクティブ (ハーフ) クローズを行います。クライアントのハーフクローズのため、サーバーは常にPOLLHUP
とを取得しています。POLLERR
も表示POLLRDHUP
されるので、実際には半分閉じており、接続の閉じ/リセットではないことがわかります。私の問題は、以前の投票で半減期があったことをすでに知っているにもかかわらず、常にこれらのイベントを取得することです。
これを無効にして、is イベントを受信しないようにするにはどうすればよいですか? 追加して を実行しようとしましread()
たshutdown(fd, SHUT_RD)
が、役に立たないようです。poll
すでに処理したイベントに目覚めたくありません。
networking - TCPハーフクローズに関する質問
次の写真を参照してください:
クライアントはハーフクローズ要求を開始し、確認応答を取得します。ハーフクローズの意味を誤解していなければ、クライアントはその後データを送信できないはずです。その後、どうすればACKを後で送り返すことができますか。
http - HTTP/1.1 では、接続を半分閉じることでリクエストの終わりを区切ることができますか?
RFC2616 パート 4.4は、HTTP/1.1 でメッセージの終わりを決定する方法を指定します。そのセクションの項目 5 は、応答が終了したことを示すためにサーバーが接続を閉じる可能性があることを指定します。
また、このようにリクエストを区切ることは不可能だとも言い続けています。ただし、TCP を使用すると、クライアントは自分の側を閉じて、応答を受信し続けることができます。私もそれをテストしました。できます。
質問:
1999 年付けの標準では、実際には可能であるのに、なぜ不可能であると書かれているのでしょうか? TCP はそれまでに十分に確立されており、それまでに長い間ハーフクローズをサポートしていました (おそらく 1974 年以来ずっと?)。
クライアントが要求の終了を示すために接続を半分閉じることは、プロトコル違反ですか?
これが良い考えであるかどうかは無視してください: 接続が意図的に閉じられたのか単に壊れたのかがよくわからない場合があること、および後で再利用するために接続を開いたままにしておく方がはるかに理にかなっているということは承知しています。
tcp - TCP エンドポイントは、他のエンドポイントが接続の両方の半分を閉じたのか、片方だけを閉じたのかをどのように知るのでしょうか?
2 つの TCP エンドポイント間で確立された TCP 接続を考えてみましょう。そのうちの 1 つは次のいずれかを呼び出します。
close()
: ここでは、これ以上の読み取りまたは書き込みは許可されていません。shutdown(fd, SHUT_WR)
: これにより、全二重接続がシンプレックス接続に変換されます。この場合、エンドポイントの呼び出しSHUT_WR
は引き続き読み取ることができます。
ただし、どちらの場合も、FIN パケットがワイヤ上でピア エンドポイントに送信されます。問題は、FIN を受信する TCP エンドポイントが、他のエンドポイントがclose()
またはを使用したかどうかをどのように区別できるかというSHUT_WR
ことです。後者のシナリオでは、まだデータを送信できるはずだからです。
c# - 読み取り側でシャットダウンを受け取った後、ソケットへの書き込みにヘルプが必要です
私が取り組んでいる全体的なビジネス アプリケーションの一部として、C# で HTTP プロキシを実装しようとしていますが、次の難問に遭遇しました。
HTTP 標準の一部では、ブラウザがソケット シャットダウン (SocketShutdown.Send) を発行する可能性があることを指定しています。この時点で、サーバーは残りのデータをブラウザに配信し、ソケットの半分を閉じます。ブラウザが接続を半分閉じると、ソケットの受信側で期待される動作が得られます。つまり、Select() はソケットが読み取り可能であることを示しますが、Receive() を使用してソケットから読み取るとゼロバイトが返されます。しかし、Send() を使用して自分のソケット側に書き込もうとすると、WSAECONNRESET を示す SocketException が発生します。ブラウザによる Shutdown() によって、インバウンド レッグだけでなく、TCP 接続全体が切断されているかのようです。
C# で半分閉じたソケットを使用した経験がある人、特にピアによって半分閉じられたソケットに書き込んだ経験のある人はいますか?
サンプルコードは今のところありませんが、回答いただける方がいなければ提供します。
python - 理由がわからない無限ループ ( DichotomySearch )
だから私は二分法で用語を検索するプログラムに取り組んでいます。それは無限ループを作り、理由はわかりませんが、どこにあるかは知っています( elif/else 内)。だからここに私のコードがあります:
もっと簡単に行う方法がたくさんあることは知っていますが、リストをそのままにしておく必要があります。ありがとうございます!
python - 接続中の IP の変更 (ハーフ オープン接続)
私のプロジェクトでは、TCP プロトコルに基づく両面接続があります。1 つは情報を待ち(PC)、もう 1 つは情報を送信します(電話)。
デバイス間の接続が生きている間に電話の WiFi 接続 (IP アドレス) を変更すると、PC 側は電話が既に切断されていることを認識していないことに気付きました。
ハーフオープン接続と呼ばれるものだと思いますが、私が理解している限り、PC側は切断を検出するために空のメッセージを送信する必要がありますが、それを行うことができません. を使用してみsocket.send("".encode("utf-8"))
ましたが、エラーは発生していないようです。
片側が切断されても、接続はまだ生きていますか? また、PC は Python でこの問題をどのように検出できますか?
また、recv
コマンドの実行中に (別のスレッドの) ソケットから情報を送信するとどうなりますか?
tcp - Netty で 4 ウェイ クローズ ハンドシェイクが完了しているかどうかを知る方法はありますか?
netty tcp クライアント サービスを開発しています。
私の質問
サービスが channel.close() を呼び出した後、サーバーも channel.close() を呼び出したかどうかを知る方法はありますか? つまり、4ウェイクローズハンドシェイクが完了したかどうかを知る方法はありますか?
バックグラウンド
私のサービスは、以下のようないくつかの制約がある1つのターゲットデバイス(サーバー側)と通信します
- 1 つのクライアント接続のみが許可されます。
- 既に接続がある場合は、すぐに新しい接続を閉じます。
- 接続が半分閉じられていても、以前の接続はアクティブな接続と見なされます。
私のコードはおおよそ次のように実行されます。
2 番目のループで新しい接続が確立されると、最初のループで使用された接続がまだハーフクローズ状態であるため、サーバーは新しい接続を閉じます。
以下のパケット キャプチャを見ると、(1) Half Closed 状態で、(2) 新しい接続が確立され、(3) サーバーが悪い接続状態を通知し、新しい接続を強制的に閉じていることがわかります。
したがって、以下に示すようにスリープを追加することで、4 ウェイ ハンドシェイクが終了するまで待つことができます。
しかし、私はより良い方法が欲しいです。