Ruby 如何获取 TCPSocket 接收缓冲区中数据的长度

yuhaidonghd · 2014年01月26日 · 最后由 yuhaidonghd 回复于 2014年02月03日 · 3793 次阅读

如题,相当于 Unix 中fcntl(FIONREAD, &result)的效果。还有求推荐一个好用的 Socket 库。

Ruby 标准库中就有设计精良的 TCPSocket 包装。

只需要 require 'socket' 即可。

http://ruby-doc.org/stdlib-2.1.0/libdoc/socket/rdoc/TCPSocket.html

#1 楼 @zw963 标题里的TCPSocket指的就是这个。我翻遍了它的 ancestors 也没找到这么一个方法。而且感觉 ruby 的 socket 包装并没有那么设计精良,常用的 web server 貌似都用 C 扩展自己实现一套。

#2 楼 @yuhaidonghd

其实我并不明白你的需求是什么。呵呵。如果你说没有就没有吧。

说起标准库,设计精良 只是我对 Ruby 的一个习惯性的说法吧。性能不是我考虑的, 但至少是经过很好的测试的。虽然有些标准库,例如大名鼎鼎的 irb, 代码风格实在不怎么好, 写的挺混乱。看样子,日本的这些 Ruby 核心开发人员,编码的习惯也风格不一吧。

倒是某些 gem, 例如:minitest, 代码写的太漂亮了。

标准库有 fcntl

命令行 ri Fcntl 可以看怎么用

#4 楼 @luikore 大神光顾,真是不胜感激啊。这个我原来也查过,貌似没找到,我再仔细看看吧。这个问题换一个问法:IO.select + TCPSocket,当 select 返回某个 socket 可读时,如何从该 socket 中读出缓冲区中的 全部数据?我现在想到的办法是先获取接收缓冲区大小buf_size,然后用read_nonblock(buf_size)readpartial(buf_size)

快过年了还有人回答,非常感谢。祝大家新春快乐。

#5 楼 @yuhaidonghd socket 应该有个 read_nonblock

#7 楼 @luikore read_nonblock是需要参数的,传什么数能保证全读出来呢?

#8 楼 @yuhaidonghd 不是所有的 fd 都支持 FIONREAD 的,可以循环 read_nonblock 读到结果长度为 0...

哈哈,我师傅马年出马了...

#9 楼 @luikore 这个也想过,既然大神都这么说了,看来是没有什么更好的方法了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号