2013-05-06 45 views
1

我寫了一些簡單的代碼來學習TCPSocket的結構。我認爲這就像一個IO流,所以我試圖用seek移動「讀取位置」回一個字節:爲什麼IO#不能用於TCPSocket?

socket.gets #=> hello world 
socket.seek(-5, IO::SEEK_CUR) 
socket.gets #=> hello world # this should return world 

,但是,它給了我一個錯誤:

server.rb:11:in `seek': Illegal seek (Errno::ESPIPE) 

沒有人有一個想法爲什麼這不起作用?

回答

3

如果是這種情況,那麼套接字需要保留所有數據,如果有人會決定向後尋找(以及如何尋找工作,阻止更多數據?)。你也許很容易寫周圍,保持位置的軌道插座包裝類,如果需要等

可以緩衝的所有數據或塊,但也許你可以嘗試結合使用IO#bytesIO#charsEnumerator#peek

+2

向前尋找顯然會使用tachyons來找出未來將要下載的內容。 – tadman 2013-05-06 11:18:21

+0

TIL這樣的粒子有很酷的名字,謝謝:) – 2013-05-06 11:33:16

1

TCP/IP將更像是在磁盤上有一系列文件,一次只能讀取文件。這些文件必須按順序讀取,並且不能前後移動。它不能隨機I/O,就像你可以在磁盤上做的那樣,它更像是一個串行連接,你只能看到事物的顯示。

爲了做你想做的事情,你必須建立一個緩衝區,在其中添加每個塊(即文件),重構整個消息。如果你想在任何時候向後看,你必須查看你的緩衝區。如果你想展望未來,你必須等待該塊被接收並閱讀並追加。

這是一個簡單的解釋。有可能要求在IP中重新發布數據塊,但實際上,在我們通常工作的級別上,我們只能向前閱讀。

相關問題