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