From: Magnus Holm Date: 2013-05-06T01:01:52+09:00 Subject: [ruby-core:54805] Re: [ruby-trunk - Feature #8368][Open] Socket.getifaddrs --001a11c2653a58157804dbfaa185 Content-Type: text/plain; charset=UTF-8 Shouldn't this be moved to CommonRuby? On Sunday, May 5, 2013, naruse (Yui NARUSE) wrote: > > Issue #8368 has been updated by naruse (Yui NARUSE). > > Target version set to current: 2.1.0 > > I'm for this method. > ---------------------------------------- > Feature #8368: Socket.getifaddrs > https://bugs.ruby-lang.org/issues/8368#change-39144 > > Author: akr (Akira Tanaka) > Status: Open > 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' > [# hatype:772 HOST hwaddr:00:00:00:00:00:00]>, > # protocol:0 eth0 hatype:1 HOST hwaddr:00:16:3e:95:88:bb] broadcast:[PACKET > protocol:0 eth0 hatype:1 HOST hwaddr:ff:ff:ff:ff:ff:ff]>, > # hwaddr:00:00:00:00]>, > # netmask:[255.0.0.0]>, > # [221.186.184.67] netmask:[255.255.255.240] broadcast:[221.186.184.79]>, > # netmask:[ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]>, > # [fe80::216:3eff:fe95:88bb%eth0] netmask:[ffff:ffff:ffff:ffff::]>] > > 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/ > > -- // Magnus Holm --001a11c2653a58157804dbfaa185 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Shouldn't this be moved to CommonRuby?

On Sunday, M= ay 5, 2013, naruse (Yui NARUSE) wrote:
<= br> Issue #8368 has been updated by naruse (Yui NARUSE).

Target version set to current: 2.1.0

I'm for this method.
----------------------------------------
Feature #8368: Socket.getifaddrs
https://bugs.ruby-lang.org/issues/8368#change-39144

Author: akr (Akira Tanaka)
Status: Open
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.

=C2=A0 % ./ruby -rpp -rsocket -e 'pp Socket.getifaddrs'
=C2=A0 [#<Socket::Ifaddr lo UP,LOOPBACK,RUNNING,0x10000 [PACKET protocol= :0 lo hatype:772 HOST hwaddr:00:00:00:00:00:00]>,
=C2=A0 =C2=A0#<Socket::Ifaddr eth0 UP,BROADCAST,RUNNING,MULTICAST,0x1000= 0 [PACKET protocol:0 eth0 hatype:1 HOST hwaddr:00:16:3e:95:88:bb] broadcast= :[PACKET protocol:0 eth0 hatype:1 HOST hwaddr:ff:ff:ff:ff:ff:ff]>,
=C2=A0 =C2=A0#<Socket::Ifaddr sit0 NOARP [PACKET protocol:0 sit0 hatype:= 776 HOST hwaddr:00:00:00:00]>,
=C2=A0 =C2=A0#<Socket::Ifaddr lo UP,LOOPBACK,RUNNING,0x10000 [127.0.0.1]= netmask:[255.0.0.0]>,
=C2=A0 =C2=A0#<Socket::Ifaddr eth0 UP,BROADCAST,RUNNING,MULTICAST,0x1000= 0 [221.186.184.67] netmask:[255.255.255.240] broadcast:[221.186.184.79]>= ,
=C2=A0 =C2=A0#<Socket::Ifaddr lo UP,LOOPBACK,RUNNING,0x10000 [::1] netma= sk:[ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]>,
=C2=A0 =C2=A0#<Socket::Ifaddr eth0 UP,BROADCAST,RUNNING,MULTICAST,0x1000= 0 [fe80::216:3eff:fe95:88bb%eth0] netmask:[ffff:ffff:ffff:ffff::]>]

This method can be used to choose multicast-enabled interfaces.
Multicast applications needs to identify a such interface to sending a mult= icast datagram.

=C2=A0 % ./ruby -rpp -rsocket -e '
=C2=A0 pp Socket.getifaddrs.reject {|ifaddr|
=C2=A0 =C2=A0 !ifaddr.addr.ip? || (ifaddr.flags & Socket::IFF_MULTICAST= =3D=3D 0)
=C2=A0 }.map {|ifaddr| [if= addr.name, ifaddr.ifindex, ifaddr.addr] }'
=C2=A0 [["eth0", 2, #<Addrinfo: 221.186.184.67>],
=C2=A0 =C2=A0["eth0", 2, #<Addrinfo: fe80::216:3eff:fe95:88bb%= eth0>]]

This method can be used to obtain broadcast addresses to send a broadcast messages. =C2=A0(use case: [ruby-talk:329921])

Also, the broadcast addresses can be used to receive broadcast messages. (Programming UNIX Sockets in C: 4.12. =C2=A0How can I write a multi-homed s= erver?
=C2=A0http://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, MS= VC 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.getifaddr= s,
instead of constructing the result from currentn data structures such as Ar= ray.
This choice make us possible to implement Socket::Ifaddr#inspect to show fl= ags 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 interfa= ce.




--
http://bugs.ruby-l= ang.org/



--

// Magnus Holm
--001a11c2653a58157804dbfaa185--