ライブラリ(.NET)で奇妙な動作を分離しようとするいくつかのテストを行っています。 C++でWinsock APIを使用してclosesocket()を呼び出すと、ウィンドウ側からFIN/ACKパケットが送信され、リモート側からACKパケットが返ってきます。これは私が優雅な終わりと呼ぶものです。しかし、C#でプログラミングするとき、私は優雅な終わりと呼ぶものを見ていません。.NETライブラリが閉じるときにRSTパケットを送信するのを防ぐ方法
C#ではソケットを開いて閉じて、ウィンドウにFINパケットを送信します。最初にSocket.Shutdown()を呼び出すときはのみです。しかし、関係なく、C#でSocket.Close()を呼び出すと、RSTパケットが送信され、接続が一時的に破棄されます。これは私が混乱させる理由は、TCPクローズプロセスがFIN/ACK - > ACKでなければならないからです(実際には両方の側からですが、今のところ私は "私"の側にしか関係しません)。すなわち、ミックス内にはRSTパケットが全く存在すべきではない。私が読んだところでは、明らかに、RSTパケットは、受信者が接続状態について不明確で、必要なときにのみ送信されます。
このRSTパケットは、.NETの計画シャットダウン時に送信され、winsock APIからの計画されたシャットダウンでは送信されないのはなぜですか? .NETからの正常なシャットダウン中にRSTパケットの送信を防止する方法はありますか?
どちらのコードパスでも、それぞれのclose()メソッドを呼び出す前に、ソケット上の利用可能なすべてのデータを読み込んでいます。
これは興味深いことです。私は睡眠を実装するときに何が起こるかを見なければならないでしょう。私はこれが起こっている完全な文脈のためにこれが実行可能であるとは思わないので、他に何が出現するのだろうか?私は動作を分離するスケルトンプログラムを作った。とにかくおかげさまで私はここで睡眠呼出しを使用することを考えなかったので、 –