私は IMAP サーバーで作業しています。操作の 1 つは、(STARTTLSコマンドを使用して) TLS を使用するように接続をアップグレードすることです。現在のアーキテクチャには、ソケットからデータを読み取り、コマンドを解析し、チャネルを介して論理コマンドを送信するゴルーチンが 1 つあります。別のゴルーチンがそのチャネルから読み取り、コマンドを実行します。これは一般的にうまく機能します。
STARTTLSただし、 を実行するときは、現在進行中のRead()呼び出しを停止する必要があります。そうしないとRead()、TLS ハンドシェイクからのバイトが消費されます。間に別のクラスを挿入できますが、そのクラスはRead()呼び出しでブロックされ、同じ問題が発生します。ネットワーク接続がチャネルである場合、別の信号チャネルを追加し、select{}ブロックを使用して読み取りを停止できますが、ネットワーク接続はチャネルではありません (ゴルーチンとチャネルでラップするだけで、問題がそのゴルーチンに移動するだけです)。
Read()タイムアウトが期限切れになるなどを待たずに、通話が開始されたら通話を停止する方法はありますか?