From: "akr (Akira Tanaka)" Date: 2013-05-11T17:33:43+09:00 Subject: [ruby-core:54911] [ruby-trunk - Feature #8368] Socket.getifaddrs Issue #8368 has been updated by akr (Akira Tanaka). It seems no one against for this method and naruse-san (the release manager of Ruby 2.1.0) supported. I added Socket.getifaddrs. ---------------------------------------- Feature #8368: Socket.getifaddrs https://bugs.ruby-lang.org/issues/8368#change-39250 Author: akr (Akira Tanaka) Status: Closed Priority: Normal Assignee: Category: Target version: current: 2.1.0 I'd like to add a method: Socket.getifaddrs. This method is a wrapper to getifaddrs() function. The result is an array of instances of Socket::Ifaddr class as follows. % ./ruby -rpp -rsocket -e 'pp Socket.getifaddrs' [#, #, #, #, #, #, #] This method can be used to choose multicast-enabled interfaces. Multicast applications needs to identify a such interface to sending a multicast datagram. % ./ruby -rpp -rsocket -e ' pp Socket.getifaddrs.reject {|ifaddr| !ifaddr.addr.ip? || (ifaddr.flags & Socket::IFF_MULTICAST == 0) }.map {|ifaddr| [ifaddr.name, ifaddr.ifindex, ifaddr.addr] }' [["eth0", 2, #], ["eth0", 2, #]] This method can be used to obtain broadcast addresses to send a broadcast messages. (use case: [ruby-talk:329921]) Also, the broadcast addresses can be used to receive broadcast messages. (Programming UNIX Sockets in C: 4.12. How can I write a multi-homed server? http://www.faqs.org/faqs/unix-faq/socket/ ) getifaddrs() is not standardized but many platforms have. BSDI, FreeBSD, NetBSD, OpenBSD, DragonFly, MirOS, GNU/Linux, MacOS X, SunOS 5.11 (OpenIndiana), Cygwin 1.7.15 From Gnulib document, getifaddrs() is not exist on AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, MSVC 9, Interix 3.5, BeOS. http://www.gnu.org/software/gnulib/manual/html_node/getifaddrs.html I implemented new Socket::Ifaddr class for return value of Socket.getifaddrs, instead of constructing the result from currentn data structures such as Array. This choice make us possible to implement Socket::Ifaddr#inspect to show flags as its names (UP,...). Also, struct getifaddrs contains Address-specific data, ifa_data which may be extended by platforms. When we find a way to extract some data from ifa_data, we can add a method for that. Socket::Ifaddr is different from Socket::Interface by http://bugs.ruby-lang.org/issues/8075 . They have no one-to-one mapping. For example, Socket.getifaddrs returns two or more elements for one interface. -- http://bugs.ruby-lang.org/