Ruby 2.4

UNIXServer

UNIXServer类

Parent:UNIXSocket

UNIXServer表示UNIX域流服务器套接字。

公共类方法

new(path) → unixserver Show source

创建绑定到路径 的新UNIX服务器套接字。

require 'socket' serv = UNIXServer.new("/tmp/sock") s = serv.accept p s.read

static VALUE unix_svr_init(VALUE sock, VALUE path) { return rsock_init_unixsock(sock, path, 1 }

公共实例方法

accept → unixsocket Show source

接受传入的连接。它返回一个新的UNIXSocket对象。

UNIXServer.open("/tmp/sock") {|serv| UNIXSocket.open("/tmp/sock") {|c| s = serv.accept s.puts "hi" s.close p c.read #=> "hi\n" } }

static VALUE unix_accept(VALUE sock) { rb_io_t *fptr; struct sockaddr_un from; socklen_t fromlen; GetOpenFile(sock, fptr fromlen = (socklen_t)sizeof(struct sockaddr_un return rsock_s_accept(rb_cUNIXSocket, fptr->fd, (struct sockaddr*)&from, &fromlen }

accept_nonblock(options) → unixsocket Show source

在为基础文件描述符设置O_NONBLOCK后,使用accept(2)接受传入连接。它为传入连接返回一个可接受的UNIXSocket。

require 'socket' serv = UNIXServer.new("/tmp/sock") begin # emulate blocking accept sock = serv.accept_nonblock rescue IO::WaitReadable, Errno::EINTR IO.select([serv]) retry end # sock is an accepted socket.

如果调用#accept_nonblock失败,请参阅Socket#accept以了解可能会抛出的异常。

#accept_nonblock可能引发与accept(2)失败相对应的任何错误,包括Errno :: EWOULDBLOCK。

如果例外是Errno :: EWOULDBLOCK,Errno :: EAGAIN,Errno :: ECONNABORTED或Errno :: EPROTO,则它由IO :: WaitReadable扩展。所以IO :: WaitReadable可以用来解救重试accept_nonblock的异常。

通过将关键字参数异常指定为false,可以指示#accept_nonblock不应引发IO :: WaitReadable异常,而是返回符号:wait_readable。

参阅

  • #accept

  • Socket#accept

# File ext/socket/lib/socket.rb, line 1337 def accept_nonblock(exception: true) __accept_nonblock(exception) end

listen( int ) → 0 Show source

侦听连接,使用指定的int作为积压。 只有在套接字类型为SOCK_STREAM或SOCK_SEQPACKET的情况下才能调用侦听。

参数

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

  • Errno :: EBADF - 套接字参数不是有效的文件描述符

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

  • Errno :: EINVAL - 套接字已经连接

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

  • Errno :: EOPNOTSUPP - 套接字协议不支持listen

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

  • Errno :: EINVAL - 套接字已关闭

  • Errno :: ENOBUFS - 系统中可用资源不足以完成callWindows异常在Windows系统中,如果侦听呼叫失败,可能会引发以下系统异常:

  • Errno :: ENETDOWN - 网络已关闭

  • Errno :: EADDRINUSE - 套接字的本地地址已被使用。这通常发生在执行绑定期间,但如果绑定 调用是部分通配符地址(涉及ADDR_ANY),并且在调用时需要提交特定地址以便侦听

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

  • Errno :: EINVAL - 套接字尚未绑定调用进行绑定。

  • Errno :: EISCONN - socket已连接

  • Errno :: EMFILE - 不再有套接字描述符可用

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

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

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

参阅

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

  • 在Microsoft的Winsock函数参考中监听函数

VALUE rsock_sock_listen(VALUE sock, VALUE log) { rb_io_t *fptr; int backlog; backlog = NUM2INT(log GetOpenFile(sock, fptr if (listen(fptr->fd, backlog) < 0) rb_sys_fail("listen(2)" return INT2FIX(0 }

sysaccept → file_descriptor Show source

接受新的连接。它返回一个整数的新文件描述符。

UNIXServer.open("/tmp/sock") {|serv| UNIXSocket.open("/tmp/sock") {|c| fd = serv.sysaccept s = IO.new(fd) s.puts "hi" s.close p c.read #=> "hi\n" } }

static VALUE unix_sysaccept(VALUE sock) { rb_io_t *fptr; struct sockaddr_un from; socklen_t fromlen; GetOpenFile(sock, fptr fromlen = (socklen_t)sizeof(struct sockaddr_un return rsock_s_accept(0, fptr->fd, (struct sockaddr*)&from, &fromlen }