当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby UNIXServer.listen用法及代码示例


用法

listen( int ) → 0

使用指定的int 作为 backlog 侦听连接。仅当 socket 的类型为 SOCK_STREAM 或 SOCK_SEQPACKET 时,才能调用 listen

参数

  • backlog - 待处理连接队列的最大长度。

示例 1

require 'socket'
include Socket::Constants
socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )
socket.bind( sockaddr )
socket.listen( 5 )

示例 2(监听任意端口,仅基于 unix 的系统):

require 'socket'
include Socket::Constants
socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
socket.listen( 1 )

基于 Unix 的异常

在基于 unix 的系统上,上述方法将起作用,因为在地址 ADDR_ANY 上创建了一个新的 sockaddr 结构,用于内核传递的任意端口号。它不适用于 Windows,因为 Windows 要求 socket 必须通过调用 bind 才能绑定 listen

如果 backlog 数量超过实现相关的最大队列长度,将使用实现的最大队列长度。

在基于 unix 的系统上,如果对 listen 的调用失败,可能会引发以下系统异常:

  • Errno::EBADF - socket 参数不是有效的文件说明符

  • Errno::EDESTADDRREQ - socket 未绑定到本地地址,并且协议不支持侦听未绑定的套接字

  • Errno::EINVAL - socket 已连接

  • Errno::ENOTSOCK - socket 参数不引用套接字

  • Errno::EOPNOTSUPP - socket 协议不支持监听

  • Errno::EACCES - 调用进程没有适当的权限

  • Errno::EINVAL - socket 已关闭

  • Errno::ENOBUFS - 系统资源不足,无法完成调用

Windows 异常

在 Windows 系统上,如果对 listen 的调用失败,可能会引发以下系统异常:

  • Errno::ENETDOWN - 网络已关闭

  • Errno::EADDRINUSE - 套接字的本地地址已被使用。这通常发生在 bind 的执行期间,但如果对 bind 的调用是针对部分通配符地址(涉及 ADDR_ANY)并且如果在调用时需要提交特定地址,则可能会延迟listen

  • Errno::EINPROGRESS - Windows Sockets 1.1 调用正在进行或服务提供者仍在处理回调函数

  • Errno::EINVAL - socket 尚未与对 bind 的调用绑定。

  • Errno::EISCONN - socket 已连接

  • Errno::EMFILE - 没有更多的套接字说明符可用

  • Errno::ENOBUFS - 没有可用的缓冲区空间

  • Errno::ENOTSOC - socket 不是套接字

  • Errno::EOPNOTSUPP - 引用的 socket 不是支持 listen 方法的类型

参看

  • 在基于 Unix 的系统上收听手册页

  • 微软 Winsock 函数参考中的监听函数

相关用法


注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 UNIXServer.listen。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。