ruby - 为什么 IO#seek 不适用于 TCPSocket?

标签 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)

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

最佳答案

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

但也许你可以尝试使用 IO#bytesIO#chars结合Enumerator#peek

关于ruby - 为什么 IO#seek 不适用于 TCPSocket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16396779/

相关文章:

ruby-on-rails - Ruby 或 Rails 对两个/多个日期字段进行排序

c# - 在 Unity 中关闭打开的套接字

sockets - 支持 haproxy 中的 TCP_KEEPCNT 功能吗?

php - 有没有等同于 PHP 提取物的 Ruby?

java - 在Java中,我们可以只使用一个套接字同时运行多个ObjectOutputStream吗?

java - 通过套接字发送对象,但不同语言的客户端,如何使对象序列化?

将结构值复制到缓冲区(客户端)并将其检索到缓冲区(服务器端)

ruby - 在 Ruby 中使用 2 个助手构造函数的惯用方法

ruby - 如何注入(inject)辛特拉/哈姆?

ruby - 将单对哈希拆分为其键和值?