UNIXServer

UNIXServer (UNIX 도메인 스트림 서버 소켓)

UNIXServerUNIX 도메인 스트림 서버 소켓을 나타내는 클래스예요. 같은 머신 안의 프로세스끼리 통신할 때 빈번하게 쓰는 유닉스 소켓의 서버 쪽이에요.

출처: Ruby 3.3 API

본문

new(path) → unixserver

path에 바인딩된 새 UNIX 서버 소켓을 만들어요.

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

accept → unixsocket

들어오는 연결을 받아들여요. 새로운 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

기본 파일 디스크립터에 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.

listen(int) → 0

주어진 int를 backlog로 사용해 연결을 기다려요. listen은 소켓이 SOCK_STREAM 또는 SOCK_SEQPACKET 타입일 때만 적용돼요. backlog는 대기 중인 연결의 최대 큐 길이예요.

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)

sysaccept → file_descriptor

새 연결을 받아들여요. 정수인 새 파일 디스크립터를 돌려줘요.

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