usocket ライブラリを使用して、比較的単純なタスク (データのエコー バックなど) を実行する単純なサーバー プログラムを作成しようとしています。単一のクライアントからの入力を待っている間に単一のスレッドがブロックされないように、複数のクライアントでこれを実行できるようにしたいと考えています。wait-for-input
を使用して、特定のソケットに入力の準備ができているかどうかを確認できることがわかりました:timeout 0
。でも、read-sequence
思い通りに仕事ができなくて困っています。50 個の要素を持つ配列を指定した場合、5 個しか使用できない場合、50 個が使用可能になるまで待機してそれらを配列に入れます。
入力を常に待つことなく、単一のスレッドのみで一度に (効率的に) ブロックを読み取る方法はありますか? それとも、read-byte
すべてを取得するまで何度も電話する必要がありますか?
read-sequence
その時点で利用可能な量だけを読み取るのと同等のものがある場合、または配列を適切にサイズ設定できるように、読み取る準備ができている要素の数を通知する関数があれば、問題を回避できます。しかし、私はそのどちらも知りません。
更新: 文字を読み取る必要のないバイナリ ソリューションを特に探しているのでread-char-no-hang
、listen
、 などを含むソリューションは、同等のバイナリがない限り、あまり役に立ちません。UTF-8 などの一部の文字エンコーディングには、文字表現のない無効なバイト シーケンスが含まれる可能性があるため、文字を処理したくありません。バイトのシーケンス。そして、私は特に、一度に1バイトずつ何度も読み取る必要のない解決策、またはそのような解決策が(標準に)存在しないことの確認のいずれかを探しています。その場合、最も便利な方法について聞きたいですそれを実現するために最低限必要なものを提供できるライブラリ。usocket
一度に 1 バイトずつ読み取るのが最速の方法ではないというだけでなく、すべてのバイトに対して'swait-for-input
関数を使用するために、ノンブロッキングの方法でそれを行うために私が書いた関数も必要です(listen
バイトストリームでは機能しないため) )、関数がソケットについて知る必要がありread-all-bytes
、たとえばファイルストリームでは機能しない過度に具体的な関数を作成する必要があります。それは可能ですが、もっと一般的な方法があることを願っています。