本文简要介绍ruby语言中 Socket.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 Socket.pair用法及代码示例
- Ruby Socket.udp_server_sockets用法及代码示例
- Ruby Socket.unpack_sockaddr_in用法及代码示例
- Ruby Socket.udp_server_recv用法及代码示例
- Ruby Socket.new用法及代码示例
- Ruby Socket.tcp用法及代码示例
- Ruby Socket.getservbyport用法及代码示例
- Ruby Socket.gethostname用法及代码示例
- Ruby Socket.unix_server_loop用法及代码示例
- Ruby Socket.sockaddr_un用法及代码示例
- Ruby Socket.accept用法及代码示例
- Ruby Socket.recvfrom_nonblock用法及代码示例
- Ruby Socket.tcp_server_sockets用法及代码示例
- Ruby Socket.bind用法及代码示例
- Ruby Socket.getaddrinfo用法及代码示例
- Ruby Socket.getnameinfo用法及代码示例
- Ruby Socket.unix_server_socket用法及代码示例
- Ruby Socket.accept_nonblock用法及代码示例
- Ruby Socket.recvfrom用法及代码示例
- Ruby Socket.unix用法及代码示例
- Ruby Socket.gethostbyaddr用法及代码示例
- Ruby Socket.ip_address_list用法及代码示例
- Ruby Socket.sysaccept用法及代码示例
- Ruby Socket.getservbyname用法及代码示例
- Ruby Socket.connect_nonblock用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Socket.listen。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。