2012-02-10 89 views
17

所以我在這裏主要的問題是如何實現結構上的ASIO TCP之上::插座或TCP :: iostream,它會實現some kind of input-seekable filter enter image description here提升iostreams:如何創建緩衝(用於讀取)TCP流?

與緩衝起來再說1kb

+6

問題是很難在異步套接字上使用流。例如,您從流中讀取一個字符串,直到緩衝區中沒有更多。但是你(或者小溪)怎麼知道它是否真的是字符串的結尾呢?其餘的可能會出現在另一個數據包中,而且無法知道它何時或實際上是否會交付。 – 2012-02-10 14:05:46

+0

出於好奇你有沒有看過這個? http://stackoverflow.com/questions/3668128/how-to-create-a-boost-ssl-iostream – NothingMore 2012-02-19 05:05:09

+0

@JoachimPileborg:這很容易知道 - 直到你達到流的結束或套接字錯誤。其餘的業務邏輯主要依賴於使用的高級協議。話雖如此,緩衝是需要的,但有C++的iostream是braindead。出於這個原因,Libevent提供了很好的通用緩衝區API。 – 2012-02-24 18:17:29

回答

0

我不熟悉這個特定的升壓模塊。但是,如果你正在尋找一種方法來創建一個類似存儲庫的緩衝區,我會創建另一個線程來管理它。線程可以傳入流,處理過濾器請求和緩衝區管理。將它保留在一個單獨的線程中意味着在系統緩衝區用完之前它將關注傳入的數據包,因此您不必擔心丟失任何內容。可以創建一個消息隊列來在線程之間進行調解。

這就是說,最終可能最容易找一個預先編寫的庫文件來處理它,並節省一點時間。退房this post

1

我認爲類似「到流的末尾」將不可能的TCP連接。 像這樣的呼叫(見下面的代碼)應該等待(阻止)連接關閉嗎?當它達到緩衝區大小時(例如1Kb)應該如何存儲響應?

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

因此,通常實現可查找的TCP流將很難(/不可能)。即使你有一個無限的緩衝區(不僅1Kb)。

當Content-Length頭被設置時,應該可以實現諸如HTTP(S)之類的特定協議的可輸入查找。但是在這種情況下,除非使用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