Spec-Zone.ru › Ruby 2.6

класс UNIXServer

Родитель:
UNIXSocket

UNIXServer представляет собой сокет сервера потокового соединения доменного типа UNIX.

Методы класса Public

new(path) → unixserver Показать исходный код
static VALUE
unix_svr_init(VALUE sock, VALUE path)
{
    return rsock_init_unixsock(sock, path, 1);
}

Создаёт новый сокет сервера UNIX, привязанный к path.

require 'socket'

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

Методы экземпляра Public

accept → unixsocket Показать исходный код
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);
}

Принимает входящее соединение. Возвращает новый объект UNIXSocket.

UNIXServer.open("/tmp/sock") {|serv|
  UNIXSocket.open("/tmp/sock") {|c|
    s = serv.accept
    s.puts "hi"
    s.close
    p c.read #=> "hi\n"
  }
}
accept_nonblock([options]) → unixsocket Показать исходный код
# File ext/socket/lib/socket.rb, line 1353
def accept_nonblock(exception: true)
  __accept_nonblock(exception)
end

Принимает входящее соединение, используя accept(2) после установки O_NONBLOCK для базового дескриптора файла. Возвращает принятый 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.

Обратитесь к Socket#accept для получения информации об исключениях, которые могут быть возбуждены, если вызов UNIXServer#accept_nonblock завершается неудачно.

UNIXServer#accept_nonblock может возбудить любое исключение, соответствующее ошибке вызова accept(2), включая Errno::EWOULDBLOCK.

Если исключением является Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::ECONNABORTED или Errno::EPROTO, оно дополняется IO::WaitReadable. Таким образом, IO::WaitReadable можно использовать для перехвата исключений и повторной попытки accept_nonblock.

Указав ключевое слово exception в false, вы можете указать, что accept_nonblock не должен возбуждать исключение IO::WaitReadable, а вместо этого возвращать символ :wait_readable.

См. также

  • UNIXServer#accept

  • Socket#accept

listen( int ) → 0 Показать исходный код
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);
}

Прослушивает подключения, используя указанный int в качестве значения очереди ожидающих подключений. Вызов listen применяется только если сокет socket имеет тип SOCK_STREAM или SOCK_SEQPACKET.

Параметр

  • 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 вышеуказанный код сработает, потому что новый структуру sockaddr создаётся по адресу ADDR_ANY для произвольного номера порта, переданного ядром. Он не будет работать в 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

См. также

  • Руководство по страницам listen в системах на основе UNIX

  • Функция listen в справочнике функций Microsoft Winsock

sysaccept → file_descriptor Показать исходный код
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);
}

Принимает новое подключение. Возвращает новый дескриптор файла, который является целым числом.

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"
  }
}

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API