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
}