From: zn@... Date: 2017-07-04T14:06:10+00:00 Subject: [ruby-dev:50164] [Ruby trunk Feature#13713] socketの便利メソッドのdatagramのUNIXSocket用対応 Issue #13713 has been reported by znz (Kazuhiro NISHIYAMA). ---------------------------------------- Feature #13713: socketの便利メソッドのdatagramのUNIXSocket用対応 https://bugs.ruby-lang.org/issues/13713 * Author: znz (Kazuhiro NISHIYAMA) * Status: Open * Priority: Normal * Assignee: * Target version: ---------------------------------------- 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)](https://docs.ruby-lang.org/en/2.4.0/Socket.html#method-c-new) して pack_sockaddr_un して connect する必要があるようです。 datagram の UNIXSocket も Socket.unix(path, :DGRAM) や UNIXSocket.open(path, :DGRAM) という感じで簡単に書けるようにならないでししょうか? それとも見つけられなかっただけで、すでに簡単な方法があるのでしょうか? ユースケースとしては例としてあげたように systemd の Type=notify で使われているソケットへの送信があります。 -- https://bugs.ruby-lang.org/