0

私が取り組んでいる全体的なビジネス アプリケーションの一部として、C# で HTTP プロキシを実装しようとしていますが、次の難問に遭遇しました。

HTTP 標準の一部では、ブラウザがソケット シャットダウン (SocketShutdown.Send) を発行する可能性があることを指定しています。この時点で、サーバーは残りのデータをブラウザに配信し、ソケットの半分を閉じます。ブラウザが接続を半分閉じると、ソケットの受信側で期待される動作が得られます。つまり、Select() はソケットが読み取り可能であることを示しますが、Receive() を使用してソケットから読み取るとゼロバイトが返されます。しかし、Send() を使用して自分のソケット側に書き込もうとすると、WSAECONNRESET を示す SocketException が発生します。ブラウザによる Shutdown() によって、インバウンド レッグだけでなく、TCP 接続全体が切断されているかのようです。

C# で半分閉じたソケットを使用した経験がある人、特にピアによって半分閉じられたソケットに書き込んだ経験のある人はいますか?

サンプルコードは今のところありませんが、回答いただける方がいなければ提供します。

4

1 に答える 1

0

着信 FIN がシャットダウンによるものか、クローズによるものかはわかりません。この場合、それは明らかにクローズが原因でした。インバウンド ソケット A で FIN を取得した場合の正しい方法は、対応するアウトバウンド ソケット B を書き込み用にシャットダウンし、そのソケットでインバウンド ソケット (B) として FIN を取得したときに、対応するアウトバウンド ソケット A を書き込み用にシャットダウンすることです。両方のソケットをシャットダウンしたら、両方を閉じます。

于 2013-09-05T03:11:32.510 に答える