打印

[问题求助] 为什么有些有些类的方法无法在API手册中找到?

为什么有些有些类的方法无法在API手册中找到?

在看ruby api文档的时候总是觉得它的API文档怪怪的,不太适应。

就说API的组织形式吧,都不太明白每个窗口的含义。比如在标准库API文档里边,右边的窗口都不同步,比如点某个类,右上角的method中并不是该类的所有方法,这点就不太使用。


最近在查一个socket编程的问题,

server = TCPServer.new(PORT)
while ( session = server.accept )

  mystr=session.recv(20)

发现使用recv方法接收指定大小的内容时会发生错误。然后在API手册中找不到这个recv方法究竟是哪个类定义的。

最后在源码socket.c中发现有这么一段:
  rb_define_method(rb_cBasicSocket, "recv", bsock_recv, -1);
  rb_define_method(rb_cBasicSocket, "recv_nonblock", bsock_recv_nonblock, -1);


我对源码不太了解,但是推测应该是basicsocket中定义的recv方法,可是遍历整个socket编程类,也没有在API文档中发现这个方法的说明。



请问究竟是我查找API手册的方法不对,没有找到位置呢,还是API手册本身就没有完全覆盖所有方法?
本帖最近评分记录
  • drive2me R币 +3 好问题。 2008-3-11 20:20

TOP

BasicSocket
表示套接字的抽象类。具体的套接字操作需要在子类加以定义。比如说internet domain stream socket的话,就要使用TCPSocket。

超类:
IO
类方法:
BasicSocket.do_not_reverse_lookup
BasicSocket.do_not_reverse_lookup = bool
若该值为真,则不会进行从地址到主机名的逆向解析。默认值是false。该设定的影响面非常大。

它会影响下列方法的运作。

BasicSocket#recv, IPSocket#recvfrom, UNIXSocket#recvfrom, Socket#recvfrom, IPSocket#addr, IPSocket#peeraddr, Socket.getaddrinfo

例:

require 'socket'

p TCPSocket.new('localhost', 'telnet').addr
TCPSocket.do_not_reverse_lookup = true
p TCPSocket.new('localhost', 'telnet').addr

=> ["AF_INET", 2253, "localhost", "127.0.0.1"]
 ["AF_INET", 2254, "127.0.0.1", "127.0.0.1"]

BasicSocket.for_fd(fd) ((<ruby 1.7 feature>))
为文件描述符fd生成一个新套接字。

ruby 1.7 特性: 该方法从 Socket类移动到该类中。这样就可以在任意套接字fd中生成相对应的套接字类了。

方法:
getpeername
获取对方的套接字信息。返回打包sockaddr结构体后得到的字符串。请参考getpeername(2)。

getsockname
获取套接字信息。返回打包sockaddr结构体后得到的字符串。请参考getsockname(2)。

getsockopt(level, optname)
获取套接字选项。请参考getsockopt(2)。将获取的选项数据打包成字符串后,返回该字符串。

recv(len[, flags])
从套接字获取数据,并以字符串形式将其返回。len规定了获取信息的最大长度。关于flags的具体细节,请参考recv(2)。flags的默认值是0。指定flags时使用的常数都被定义在Socket类中。(例: Socket::SO_LINGER)

send(mesg, flags[, to])
通过套接字发送数据。关于flags的具体细节,请参考send(2)。若套接字尚未进行连接时,则必须指定发送目的地to。返回实际发送数据的大小。

to中必须是将套接字地址结构体打包后得到的字符串。

若发送数据失败,则引发Errno::EXXX异常。

setsockopt(level, optname, optval)
设定套接字选项。请参考setsockopt(2)。

shutdown([how])
结束套接字的连接。若how为0,则只停止信息的接收;若为1则只停止信息的发送;若how为2,则停止信息的发送和接受全过程。how的缺省值就是2。请参考shutdown(2)。

TOP

上边是我在网上找到的。为什么API中我没有找到相应的内容呢?

TOP

可能你对Ruby的Api分类不清楚吧,Ruby的api分为core和std两个库的。就像Java和C++一样,一个是语言内置的,另一个是第三方的标准库。

这是Socket的文档
http://www.ruby-doc.org/stdlib/libdoc/socket/rdoc/index.html
本帖最近评分记录
  • drive2me R币 +3 谢谢帮助。 2008-3-11 20:21
###
blog => red_world,
mail => [image]http://services.nexodyne.com/email/icon/NTbKP7EQRA%3D%3D/c2n6Sgw%3D/R01haWw%3D/0/image.png[/image]
###

TOP

其实在本地用ri就可以查了。

以下是我用ri查到的结果:

$ qri Socket
---------------------------------------------------------- Class: Socket
     Class Socket provides access to the underlying operating system 
     socket implementations. It can be used to provide more operating 
     system specific functionality than the protocol-specific socket 
     classes but at the expense of greater complexity. In particular, 
     the class handles addresses using +struct sockaddr+ structures 
     packed into Ruby strings, which can be a joy to manipulate.

     Exception Handling
     Ruby's implementation of Socket causes an exception to be raised 
     based on the error generated by the system dependent 
     implementation. This is why the methods are documented in a way 
     that isolate Unix-based system exceptions from Windows based 
     exceptions. If more information on particular exception is needed 
     please refer to the Unix manual pages or the Windows WinSock 
     reference.

     Documentation by
     *   Zach Dennis

     *   Sam Roberts

     *   Programming Ruby from The Pragmatic Bookshelf.

     Much material in this documentation is taken with permission from 
     Programming Ruby from The Pragmatic Bookshelf.

------------------------------------------------------------------------

Constants:
     AF_INET6: Object.new

Class methods:
     getaddrinfo, gethostbyname, getservbyname

Instance methods:
     accept, accept_nonblock, bind, connect, connect_nonblock, listen, 
     recvfrom, recvfrom_nonblock, sysaccept


###
blog => red_world,
mail => [image]http://services.nexodyne.com/email/icon/NTbKP7EQRA%3D%3D/c2n6Sgw%3D/R01haWw%3D/0/image.png[/image]
###

TOP

谢谢回复。我知道是分core和Lib的。


但是在Lib文档中basicsocket中只有如下的方法



而在第二楼可以看到其实它不止有这些方法。
另外在ri中也是这样的。
附件: 您所在的用户组无法下载或查看附件

TOP

无解。。。

源码中的确有这些方法的定义。。。

等待高手解答
###
blog => red_world,
mail => [image]http://services.nexodyne.com/email/icon/NTbKP7EQRA%3D%3D/c2n6Sgw%3D/R01haWw%3D/0/image.png[/image]
###

TOP

Ruby文档本身就不健全,这个问题太专牛角尖了,网上能查到,能用就OK了。
本帖最近评分记录
  • drive2me R币 +3 谢谢帮助。 2008-3-11 20:21

I.forget('you'){|something| something.remember.deepen}

TOP

同意楼上的,我们的RUBY不是还在完善吗?
本帖最近评分记录
  • drive2me R币 +3 谢谢帮助。 2008-3-11 20:22

TOP

2008-12-05 05:34 Crawled by CCBot/1.0 (+http://www.commoncrawl.org/bot.html) @38.103.63.61