为什么IO#不寻求TCPSocket的工作?

时间:2013-05-06 10:29:02

标签: ruby sockets

我写了一些简单的代码来学习TCPSocket的结构。我认为它就像一个IO流,所以我尝试使用seek将“阅读位置”移回一个字节:

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)

有没有人知道为什么这不起作用?

2 个答案:

答案 0 :(得分:3)

如果是这种情况,那么套接字需要保留所有数据,如果有人决定向后搜索(以及如何转发搜索工作,阻止更多数据?)。您可以很容易地在套接字周围编写一个包装类来跟踪一个位置,并在需要时缓冲所有数据或块等。

但也许您可以尝试将IO#bytesIO#charsEnumerator#peek结合使用?

答案 1 :(得分:1)

TCP / IP更像是在磁盘上放置一系列文件,您一次只能读取一个文件。必须按顺序读取文件,并且无法前进或后退。它不具备随机I / O能力,就像你可以在磁盘上做的那样,它更像是一个串行连接,你只能在事物出现时阅读。

为了做你想做的事,你必须建立一个缓冲区,你追加每个块(即文件),重建整个消息。如果你想向后看任何一点,你必须查看你的缓冲区。如果你想要向前看,你必须等待接收并阅读和附加该块。

这是一个简单的解释。可以请求在IP中重新发送块,但实际上,在我们通常工作的级别,我们只是向前阅读。