2012-02-10 15 views
17

だからここに私の主な質問は、ASIO、TCPの上に構造を実装する方法:: 1kbを言うまでの緩衝液でsome kind of input-seekable filter enter image description hereブーストiostreams:バッファされた(読んで)TCPストリームを作成するには?

を実装したソケットまたはTCP :: iostreamのですか?

+6

問題は、ストリームを非同期ソケットで使用するのが難しいということです。たとえば、バッファーにバッファーがなくなるまでストリームからストリングを読み取ります。しかし、あなた(またはストリーム)が実際にストリングの終わりであるかどうかをどのように知ることができますか?残りのパケットは別のパケットに入ってくる可能性があり、いつ配信されるのか、実際に配信されるのかを知る方法はありません。 –

+0

あなたはこれを見てきましたか? @stackoverflow.com/questions/3668128/how-to-create-a-boost-ssl-iostream – NothingMore

+0

@JoachimPileborg:あなたがストリームの終わりに達するか、ソケットのエラーに達するまで、これは非常に簡単です。残りは、使用中の高水準プロトコルに大きく依存するビジネスロジックです。バッファリングが必要だと言われていますが、C++のiostreamを使用しているのはそのためです。 Libeventはそのような理由で素晴らしい汎用バッファAPIを提供します。 –

答えて

0

私はこの特定のブーストモジュールに慣れていません。しかし、ソートのリポジトリのように動作するバッファを作成する方法を探しているなら、それを管理する別のスレッドを作成します。スレッドは着信ストリームをLIFOし、フィルタ要求とバッファ管理を処理できます。別のスレッドに保持すると、システムバッファがなくなる前に着信パケットに注意する必要があるので、何も見つからないことを心配する必要はありません。スレッド間を仲介するメッセージキューを作成することができます。

しかし、最終的には、それを処理して少し時間を節約するために、事前に書かれた図書館に目を向けるのが最も簡単だろう。 this postをチェックしてください。

1

"ストリームの最後に行く"のようなものは、TCP接続では不可能だと思います。 このような呼び出し(次のコードを参照)は、接続を閉じるために待機(ブロック)する必要がありますか?また、バッファサイズ(たとえば1Kb)に達したときに応答をどのように保存する必要がありますか?

s.seekg (0, ios::end); 

一般的にシーク可能なTCPストリームを実装するのは難しいでしょうか?無制限のバッファ(1Kbだけでなく)があっても。

Content-Lengthヘッダーが設定されている場合、HTTP(S)などの特定のプロトコルに対してinput-seekableのようなものを実装することは可能です。しかし、このシナリオでも、HTTP/1.1 Rangeヘッダーを使用しない限り、1Kbの固定サイズのバッファーは機能しません。 Christopher M. Kohlhoff(Boost asioの著者)は、Urdl(SourceForgeの 'Prealpha'とマークされています)を実装して、HTTP接続をistreamとしてモデル化しました。これはおそらく役に立ちます: 私はread_someメソッドが面白いかもしれないと思う:https://github.com/jnorthrup/urdl/blob/master/include/urdl/detail/http_read_stream.hpp#L426

関連する問題