UNIXSocket
UNIXSocket (UNIX 도메인 스트림 클라이언트 소켓)
UNIXSocket는 UNIX 도메인 스트림 클라이언트 소켓을 나타내는 클래스예요. 유닉스 소켓 서버에 연결해서 데이터를 주고받는 쪽이에요.
출처: Ruby 3.3 API
본문
new(path) → unixsocket
path에 연결된 새 UNIX 클라이언트 소켓을 만들어요.
require 'socket'
s = UNIXSocket.new("/tmp/sock")
s.send "hello", 0
pair([type [, protocol]]) → [unixsocket1, unixsocket2] · socketpair([type [, protocol]]) → [unixsocket1, unixsocket2]
서로 연결된 소켓 한 쌍(pair) 을 만들어요. type은 :STREAM, :DGRAM, :RAW 같은 소켓 타입이어야 하고, protocol은 도메인에 정의된 프로토콜이어야 해요. 기본 프로토콜은 0이에요.
s1, s2 = UNIXSocket.pair
s1.send "a", 0
s1.send "b", 0
p s2.recv(10) #=> "ab"
addr → [address_family, unix_path]
address_family와 unix_path를 담은 배열로 로컬 주소를 돌려줘요.
serv = UNIXServer.new("/tmp/sock")
p serv.addr #=> ["AF_UNIX", "/tmp/sock"]
path → path
unixsocket의 로컬 주소 경로를 돌려줘요.
s = UNIXServer.new("/tmp/sock")
p s.path #=> "/tmp/sock"
peeraddr → [address_family, unix_path]
address_family와 unix_path를 담은 배열로 원격(peer) 주소를 돌려줘요.
serv = UNIXServer.new("/tmp/sock")
c = UNIXSocket.new("/tmp/sock")
p c.peeraddr #=> ["AF_UNIX", "/tmp/sock"]
recv_io([klass [, mode]]) → io
파일 디스크립터 전달로 받은 IO 객체를 돌려줘요. klass는 돌려받을 io의 클래스를 결정해요(IO.for_fd 싱글턴 메서드를 사용). klass가 nil이면 정수 파일 디스크립터를 돌려줘요. mode는 IO.for_fd에 전달되는 인자와 같아요.
UNIXServer.open("/tmp/sock") {|serv|
UNIXSocket.open("/tmp/sock") {|c|
s = serv.accept
c.send_io STDOUT
stdout = s.recv_io
p STDOUT.fileno #=> 1
p stdout.fileno #=> 7
stdout.puts "hello" # outputs "hello\n" to standard output.
}
}
recvfrom(maxlen [, flags[, outbuf]]) → [mesg, unixaddress]
unixsocket을 통해 메시지를 받아요. maxlen은 받을 최대 바이트 수, flags는 Socket::MSG_* 상수들의 비트 OR이에요. outbuf는 처음에 비어있지 않아도 호출 후에는 받은 데이터만 담겨요.
s1 = Socket.new(:UNIX, :DGRAM, 0)
s1_ai = Addrinfo.unix("/tmp/sock1")
s1.bind(s1_ai)
s2 = Socket.new(:UNIX, :DGRAM, 0)
s2_ai = Addrinfo.unix("/tmp/sock2")
s2.bind(s2_ai)
s3 = UNIXSocket.for_fd(s2.fileno)
s1.send "a", 0, s2_ai
p s3.recvfrom(10) #=> ["a", ["AF_UNIX", "/tmp/sock1"]]
send_io(io) → nil
io를 파일 디스크립터 전달(file descriptor passing)로 보내요. io는 어떤 종류의 IO 객체나 정수 파일 디스크립터여도 돼요.
s1, s2 = UNIXSocket.pair
s1.send_io STDOUT
stdout = s2.recv_io
p STDOUT.fileno #=> 1
p stdout.fileno #=> 6
stdout.puts "hello" # outputs "hello\n" to standard output.