TCP サーバーは、クライアントが接続しようとすると、「トランスポート接続からデータを読み取ることができません: 既存の接続はリモート ホストによって強制的に閉じられました」というエラーに遭遇することがあります。この記事では、一般的な原因を調査し、解決策を提供します。
このエラーは、sr.ReadLine()
中に (提供されたサーバー コード例の) 96 行目あたりによく表示されますが、多くの場合、トランスポート レベルのセキュリティの構成ミスが原因です。
SSL/TLS ハンドシェイク中のクライアントとサーバー間の TLS プロトコル バージョンの不一致が、このエラーの主な原因です。 System.Net.ServicePointManager.SecurityProtocol
プロパティがこれを解決する鍵となります。
.NET は通常、TLS バージョンを自動ネゴシエートしますが、クライアントとサーバーの機能の間に不一致があると、ハンドシェイクの失敗やエラー メッセージが発生する可能性があります。
互換性を確保するには、SecurityProtocol
プロパティを使用してサポートされる TLS バージョンを明示的に定義します。 接続を確立する前に次の行を追加します:
<code class="language-csharp">System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;</code>
このコード スニペットにより、TLS 1.0、1.1、および 1.2 のサポートが有効になります。 クライアントとサーバーの両方で TLS バージョンが一致すると、ハンドシェイクが確実に成功し、サーバーは中断することなくクライアントからデータを読み取ることができます。
以上がTCP サーバーに「トランスポート接続からデータを読み取ることができません」と表示されるのはなぜですか? それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。