1

我写了一些简单的代码来学习 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)

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

4

2 回答 2

3

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

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

于 2013-05-06T10:46:10.947 回答
1

TCP/IP 更像是在磁盘上有一系列文件,一次只能向前读取一个文件。文件必须按顺序读取,不能前后跳转。它不能像您在磁盘上那样进行随机 I/O,它更像是一个串行连接,您只能在事物出现时读取。

为了做你想做的事,你必须建立一个缓冲区,在其中附加每个块(即文件),重建整个消息。如果您想在任何时候向后看,您必须查看缓冲区。如果你想向前看,你必须等待该块被接收、读取和附加。

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

于 2013-05-06T13:34:28.333 回答