Project

General

Profile

Feature #13713

socketの便利メソッドのdatagramのUNIXSocket用対応

Added by znz (Kazuhiro NISHIYAMA) over 1 year ago. Updated over 1 year ago.

Status:
Rejected
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-dev:50164]

Description

https://docs.ruby-lang.org/ja/latest/class/Socket.html

ソケットオブジェクトを生成する汎用的な方法として Socket.new がありますが、以下のようなより便利な メソッドがあります。

として

  • TCP のクライアントソケット Socket.tcp TCPSocket.open
  • TCP のサーバソケット Socket.tcp_server_loop, Socket.tcp_server_sockets, TCPServer.open
  • UNIX socket のクライアントソケット Socket.unix UNIXSocket.open
  • UNIX socket のサーバソケット Socket.unix_server_loop, Socket.unix_server_socket, UNIXServer.open

があげられていて、要約には書かれていませんが、UDP 用に udp_server_loop や udp_server_sockets もありますが、datagram の UNIXSocket は Socket.unix も UNIXSocket.open も対応していなくて、

https://gist.github.com/zimbatm/9f1bc26446af0ee3e5c5#gistcomment-1902920 にあるように

def notify_socket
  @notify_socket ||= Socket.new(Socket::AF_UNIX, Socket::SOCK_DGRAM, 0).tap do |socket|
    socket.connect(Socket.pack_sockaddr_un(ENV["NOTIFY_SOCKET"]))
    socket.close_on_exec = true
  end
end

のように Socket.new(:UNIX, :DGRAM) して pack_sockaddr_un して connect する必要があるようです。

datagram の UNIXSocket も Socket.unix(path, :DGRAM) や UNIXSocket.open(path, :DGRAM) という感じで簡単に書けるようにならないでししょうか?
それとも見つけられなかっただけで、すでに簡単な方法があるのでしょうか?

ユースケースとしては例としてあげたように systemd の Type=notify で使われているソケットへの送信があります。

History

Updated by akr (Akira Tanaka) over 1 year ago

  • Status changed from Open to Feedback

こんな感じでどうですかね。

Addrinfo.unix(ENV["NOTIFY_SOCKET"], :DGRAM).connect
#2

Updated by akr (Akira Tanaka) over 1 year ago

  • Status changed from Feedback to Rejected

Also available in: Atom PDF