# AddrInfo.list\_ipaddr

**URL:** <https://www.ruby-forum.com/t/addrinfo-list-ipaddr/157570>\
**Category:** Development\
**Created:** [January 13, 2009, 8:39am UTC](https://www.ruby-forum.com/t/addrinfo-list-ipaddr/157570 "2009-01-13T08:39:45Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [January 13, 2009, 8:39am UTC](https://www.ruby-forum.com/t/addrinfo-list-ipaddr/157570/1 "2009-01-13T08:39:45Z")

</div>

e$BDs0F$J$s$G$9$,!"%[%9%H$,;}$C$F$$$ke(B IP e$B%"%I%l%9$N%j%9%H$rJV$9e(B  
e$B%a%=%C%I$rMQ0U$9$k$N$O$I$&$G$7$g$&$+!#e(B

% ./ruby -rsocket -rpp -e ‘pp AddrInfo.list\_ipaddr’  
[#\<AddrInfo: 127.0.0.1\>,  
#\<AddrInfo: 150.82.175.199\>,  
#\<AddrInfo: ::1\>,  
#\<AddrInfo: fe80::20b:97ff:fe2b:8539%eth0\>]

e$B$3$l$,$J$\<I,MW$+$H$$$&$H!"$^$:!“e(BIPv6 e$B$,MxMQ$G$-$J$$%[%9%H$re(B  
e$BH=CG$7$?$$$+$i$G$9!#\>e5-$N%j%9%H$G$Oe(B ::1 e$B$He(B  
fe80::20b:97ff:fe2b:8539%eth0 e$B$H$$$&$U$?$D$Ne(B IPv6 e$B%”%I%l%9$,e(B  
e$B$"$j$^$9$,!"$3$l$i$Oe(B loopback address e$B$He(B link local address  
e$B$H$$$&$b$N$G!"%0%m!\<%P%k$K$O;H$($J$$$b$N$G$9!#$3$NH=CG$r9T$&e(B  
e$B$3$H$K$h$j!“e(Bresolv.rb e$B$G;H$($b$7$J$$e(B IPv6  
e$B%”%I%l%9$rLd$$9g$oe(B  
e$B$;$?$jJV$7$?$j$9$k$3$H$rKI$0$3$H$,$G$-$^$9!#e(B

e$B$^$?!“e(BIP e$B%”%I%l%9$N%j%9%H$Oe(B UDP  
e$B$G%5!\<%P$r:n$k\>l9g$K$b=EMW$Ge(B  
e$B$9!#e(BUDP e$B$N%5!\<%P$OE~Ce$7$?%Q%1%C%H$N08@h$+$iJV;v$rAw$k$3$H$,e(B  
e$BK\>$^$l$^$9!#e(B[RFC 1123] e$B$^$!!“Aw$C$?$H$3$m0J30$+$iJV$9$H!”%/e(B  
e$B%i%$%"%s%H$O4X78$J$$$H$3$m$+$ie(B (e$B$"$k$$$O4m$J$$$R$H$+$ie(B)  
e$BMh$?e(B  
e$B%Q%1%C%H$@$H;W$C$FL5;k$9$k$+$b$7$l$J$$$o$1$G$9!#e(B

e$B30$K$D$J$,$C$F$$$ke(B IP e$B%"%I%l%9$,$R$H$D$G$"$l$PLdBj$K$O$J$i$Je(B  
e$B$$$s$G$9$,!“J#?t$Ne(B IP e$B%”%I%l%9$r;}$D%^%k%A%[!\<%`$J4D6-$GLdBje(B  
e$B$K$J$j$^$9!#e(B

e$B$G$O!"%Q%1%C%H$r\<u$1\<h$k$H$-$K08@h$rF@$l$P!"$H;W$&$o$1$G$9$,!“e(B  
e$B;DG0$J$3$H$Ke(B recvfrom e$B$G$O08@h$OF@$i$l$^$;$s!#e(Brecvfrom  
e$B$GF@e(B  
e$B$i$l$k%”%I%l%9$O%Q%1%C%H$NAw?.85$G$"$C$F08@h$G$O$J$$$+$i$G$9!#e(B  
e$B$^$?!"F1MM$Ke(B sendto e$B$G$b%5!\<%PB&$G$NAw?.85$r;XDj$9$k$3$H$O$Ge(B  
e$B$-$^$;$s!#e(B

e$B$3$l$r2r7h$9$k$R$H$D$NJ}K!$O!"%=%1%C%H$r$"$i$+$8$a3F%"%I%l%9e(B  
e$B$4$H$K$D$/$C$Fe(B bind e$B$7$F$\*$/$H$$$&$b$N$G$9$,!"$=$3$Ge(B IP  
e$B%"%Ie(B  
e$B%l%9$N%j%9%H$,I,MW$K$J$j$^$9!#e(B

e$B$=$l0J30$NJ}K!$H$7$F$O!"e(BIPv6 e$B$G$Oe(B IPV6\_RECVPKTINFO  
e$B$H$+e(B  
setsockopt e$B$9$k$He(B recvmsg/sendmsg e$B$G2DG=$J$h$&$G$9!#e(B[RFC  
3542]  
e$B$,!“e(BIPv4 e$B$G$OI8=`2=$5$l$?$”$k$$$O9-$/;H$($k$b$N$O$J$$$h$&$Ge(B  
e$B$9!#e(B(e$B$H$/$KAw?.85$r;XDj$9$kJ}K!$,e(B)

e$B$3$NMW5a$O2a5n$K$b2?2s$,$"$,$C$F$$$^$9!#e(B  
[ruby-talk:162689], [ruby-talk:260514], [ruby-talk:324043]

e$B$?$$$F$$!“e(BSocket.gethostname e$B$N7k2L$r5U0z$-$9$k!”$H$$$&OC$Ke(B  
e$B$J$k$s$G$9$,!"$3$l$Oe(B /etc/hosts e$B$de(B DNS  
e$B$K0MB8$9$k$J$I!“3N\<Be(B  
e$B$K;H$($k$H$$$&$b$N$G$O$”$j$^$;$s!#$d$O$j%M%C%H%o!\<%/%$%s%?!\<e(B  
e$B%U%’!\<%9$N\>pJs$,M\_$7$1$l$P!"e(B e$B%$%s%?!\<%U%’!\<%9\<+?H$K?R$M$k$Ye(B  
e$B$-$@$H;W$$$^$9!#e(B

e$B\<B:]$K?R$M$kJ}K!$O!";DG0$J$3$H$Ke(B IP e$B%"%I%l%9$N%j%9%H$rF@$kJ}e(B  
e$BK!$OI8=`2=$5$l$F$$$J$$$h$&$J$N$G!“0J2\<$r\<BAu$7$F$”$j$^$9!#e(B

- getifaddrs:  
BSD/OS, FreeBSD, NetBSD, OpenBSD, DragonFly BSD, MirOS BSD,  
GNU/Linux, MacOS X, AIX
- SIOCGLIFCONF: Solaris
- SIOCGIFCONF: 4.3BSD

e$B$I$&$d$i!"e(Bgetifaddrs e$B$OIa5Z$,?J$s$G$$$k$h$&$G$9!#e(B

4.3BSD e$B$Ne(B SIOCGIFCONF e$B$r;H$&$b$N$r\<BAu$7$F$"$k$N$G!"$=$3$KM3e(B  
e$BMh$9$k$b$N$O$@$$$?$$F0$/$s$8$c$J$$$+$H;W$$$^$9!#$?$@!"$=$N\>le(B  
e$B9g$Oe(B IPv4 e$B8BDj$K$J$j$^$9$,!#e(B  
(e$B$J$_!“e(B4.4BSD e$B$Ne(B SIOCGIFCONF e$B$O3HD%$5$l$Fe(B IPv6  
e$B$b07$($F!”$$e(B  
e$B$A$_$&$=$N\>l9g$bF0$/$h$&$K$7$F$"$j$^$9$,!"e(B4.4BSD e$B$Ge(B  
getifaddrs e$B$,$J$$4D6-$O;D$C$F$$$J$$$h$&$K;W$($^$9!#e(B)

e$B$J$\*!"$3$3$GH4$1$F$$$k$b$N$H$7$Fe(B HP-UX e$B$,$"$j$^$9$,!"$3$l$Ke(B  
e$B$Oe(B SIOCGLIFCONF e$B$,$"$k$h$&$G$9!#$?$@$7e(B Solaris  
e$B$H$O9=B$BN$,e(B  
e$B0c$&$h$&$G!"%F%9%H4D6-$,$J$$$N$G\<BAu$7$F$$$^$;$s!#\<B5!$,$"$le(B  
e$B$P$=$s$J$KFq$7$/$J$$$H;W$$$^$9!#e(B

e$B$H$$$&$o$1$G$I$&$G$7$g$&$+!#e(B

# % svn diff --diff-cmd diff -x ‘-u -p’ Index: ext/socket/socket.c

— ext/socket/socket.c (revision 21486)  
+++ ext/socket/socket.c (working copy)  
@@ -67,6 +67,20 @@  
#include \<fcntl.h\>  
#endif  
#endif  
+  
+#ifdef HAVE\_IFADDRS\_H  
+#include \<ifaddrs.h\>  
+#endif  
+#ifdef HAVE\_SYS\_IOCTL\_H  
+#include \<sys/ioctl.h\>  
+#endif  
+#ifdef HAVE\_SYS\_SOCKIO\_H  
+#include \<sys/sockio.h\>  
+#endif  
+#ifdef HAVE\_NET\_IF\_H  
+#include \<net/if.h\>  
+#endif  
+  
#ifndef EWOULDBLOCK  
#define EWOULDBLOCK EAGAIN  
#endif  
@@ -5403,6 +5417,235 @@ addrinfo\_s\_unix(VALUE self, VALUE path)

#endif

+#if defined(HAVE\_GETIFADDRS) || defined(SIOCGLIFCONF) ||  
defined(SIOCGIFCONF)  
+static VALUE  
+sockaddr\_obj(struct sockaddr \*addr)  
+{

- socklen\_t len;
- 
- if (addr == NULL)
- 

```
   return Qnil;

```

- 
- switch (addr-\>sa\_family) {  
+#ifdef HAVE\_SYS\_UN\_H
- 

```
 case AF_UNIX:

```

- 

```
   len = sizeof(struct sockaddr_un);

```

- 

```
   break;

```

+#endif  
+

- 

```
 case AF_INET:

```

- 

```
   len = sizeof(struct sockaddr_in);

```

- 

```
   break;

```

- 

+#ifdef AF\_INET6

- 

```
 case AF_INET6:

```

- 

```
   len = sizeof(struct sockaddr_in6);

```

- 

```
   break;

```

+#endif  
+

- 

```
 default:

```

- 

```
   len = sizeof(struct sockaddr_in);

```

- 

```
   break;

```

- }  
+#ifdef SA\_LEN
- if (len \< SA\_LEN(addr))
- len = SA\_LEN(addr);  
+#endif
- 
- return addrinfo\_new(addr, len, 0, 0, 0, Qnil, Qnil);  
+}  
+#endif
- 

+/\*

- 
  - call-seq:

- 
  - AddrInfo.list\_ipaddr =\> array

- 
  - 

- 
  - Returns local IP addresses as an array.

- 
  - 

- 
  - The array contains AddrInfo objects.

- 
  - 

- 
  - pp AddrInfo.list\_ipaddr

- 
  - #=\> [#\<AddrInfo: 127.0.0.1\>,

- 
  - 

```
  #<AddrInfo: 192.168.0.128>,

```

- 
  - 

```
  #<AddrInfo: ::1>,

```

- 
  - 

```
  ...]

```

- 
  - 

- \*/  
+static VALUE  
+addrinfo\_s\_list\_ipaddr(VALUE self)  
+{  
+#if defined(HAVE\_GETIFADDRS)
- struct ifaddrs \*ifp = NULL;
- struct ifaddrs \*p;
- int ret;
- VALUE list;
- 
- ret = getifaddrs(&ifp);
- if (ret == -1) {
- 

```
   rb_sys_fail("getifaddrs");

```

- }
- 
- list = rb\_ary\_new();
- for (p = ifp; p; p = p-\>ifa\_next) {
- 

```
   if (IS_IP_FAMILY(p->ifa_addr->sa_family)) {

```

- 

```
       rb_ary_push(list, sockaddr_obj(p->ifa_addr));

```

- 

```
   }

```

- }
- 
- freeifaddrs(ifp);
- 
- return list;  
+#elif defined(SIOCGLIFCONF) && defined(SIOCGLIFNUM)
- /\* Solaris if\_tcp(7P) \*/
- int fd = -1;
- int ret;
- struct lifnum ln;
- struct lifconf lc;
- char \*reason = NULL;
- int save\_errno;
- int i;
- VALUE list;
- 
- lc.lifc\_buf = NULL;
- 
- fd = socket(AF\_INET, SOCK\_DGRAM, 0);
- if (fd == -1)
- 

```
   rb_sys_fail("socket");

```

- 
- memset(&ln, 0, sizeof(ln));
- ln.lifn\_family = AF\_UNSPEC;
- 
- ret = ioctl(fd, SIOCGLIFNUM, &ln);
- if (ret == -1) {
- reason = “SIOCGLIFNUM”;
- goto finish;
- }
- 
- memset(&lc, 0, sizeof(lc));
- lc.lifc\_family = AF\_UNSPEC;
- lc.lifc\_flags = 0;
- lc.lifc\_len = sizeof(struct lifreq) \* ln.lifn\_count;
- lc.lifc\_req = xmalloc(lc.lifc\_len);
- 
- ret = ioctl(fd, SIOCGLIFCONF, &lc);
- if (ret == -1) {
- reason = “SIOCGLIFCONF”;
- goto finish;
- }
- 
- close(fd);
- fd = -1;
- 
- list = rb\_ary\_new();
- for (i = 0; i \< ln.lifn\_count; i++) {
- struct lifreq \*req = &lc.lifc\_req[i];
- 

```
   if (IS_IP_FAMILY(req->lifr_addr.ss_family)) {

```

- 

```
       rb_ary_push(list, sockaddr_obj((struct sockaddr 

```

\*)&req-\>lifr\_addr));

- 

```
   }

```

- }
- 
- finish:
- save\_errno = errno;
- if (lc.lifc\_buf != NULL)
- xfree(lc.lifc\_req);
- if (fd != -1)
- close(fd);
- errno = save\_errno;
- 
- if (reason)
- rb\_sys\_fail(reason);
- return list;
- 

+#elif defined(SIOCGIFCONF)

- int fd = -1;
- int ret;  
+#define EXTRA\_SPACE (sizeof(struct ifconf) + sizeof(struct  
sockaddr\_storage))
- char initbuf[4096+EXTRA\_SPACE];
- char \*buf = initbuf;
- int bufsize;
- struct ifconf conf;
- struct ifreq \*req;
- VALUE list = Qnil;
- char \*reason = NULL;
- int save\_errno;
- 
- fd = socket(AF\_INET, SOCK\_DGRAM, 0);
- if (fd == -1)
- 

```
   rb_sys_fail("socket");

```

- 
- bufsize = sizeof(initbuf);
- buf = initbuf;
- 
- retry:
- conf.ifc\_len = bufsize;
- conf.ifc\_req = (struct ifreq \*)buf;
- 
- /\* fprintf(stderr, “bufsize: %d\n”, bufsize); \*/
- 
- ret = ioctl(fd, SIOCGIFCONF, &conf);
- if (ret == -1) {
- 

```
   reason = "SIOCGIFCONF";

```

- 

```
   goto finish;

```

- }
- 
- /\* fprintf(stderr, “conf.ifc\_len: %d\n”, conf.ifc\_len); \*/
- 
- if (bufsize - EXTRA\_SPACE \< conf.ifc\_len) {
- if (bufsize \< conf.ifc\_len) {
- 

```
 /* NetBSD returns required size for all interfaces. */

```

- 

```
 bufsize = conf.ifc_len + EXTRA_SPACE;

```

- }
- else {
- 

```
 bufsize = bufsize << 1;

```

- }
- if (buf == initbuf)
- 

```
 buf = NULL;

```

- buf = xrealloc(buf, bufsize);
- goto retry;
- }
- 
- close(fd);
- fd = -1;
- 
- list = rb\_ary\_new();
- req = conf.ifc\_req;
- while ((char\*)req \< (char\*)conf.ifc\_req + conf.ifc\_len) {
- struct sockaddr \*addr = &req-\>ifr\_addr;
- 

```
   if (IS_IP_FAMILY(addr->sa_family)) {

```

- 

```
 rb_ary_push(list, sockaddr_obj(addr));

```

- }  
+#ifdef HAVE\_SA\_LEN  
+# ifndef \_SIZEOF\_ADDR\_IFREQ  
+# define \_SIZEOF\_ADDR\_IFREQ® (sizeof(struct ifreq) + \
- 

```
                            (sizeof(struct sockaddr) < 

```

®.ifr\_addr.sa\_len ? \

- 

```
     (r).ifr_addr.sa_len - sizeof(struct sockaddr) : \

```

- 

```
     0))

```

+# endif

- req = (struct ifreq _)((char_)req + \_SIZEOF\_ADDR\_IFREQ(\*req));  
+#else
- req = (struct ifreq _)((char_)req + sizeof(struct ifreq));  
+#endif
- }
- 
- finish:
- 
- save\_errno = errno;
- if (buf != initbuf)
- 

```
   xfree(buf);

```

- if (fd != -1)
- close(fd);
- errno = save\_errno;
- 
- if (reason)
- rb\_sys\_fail(reason);
- return list;
- 

+#undef EXTRA\_SPACE  
+#else

- rb\_notimplement();  
+#endif  
+}
- 

static VALUE  
sockaddr\_string\_value(volatile VALUE \*v)  
{  
@@ -5605,6 +5848,8 @@ Init\_socket()

```
 rb_define_method(rb_cAddrInfo, "getnameinfo", addrinfo_getnameinfo, 

```

-1);

- rb\_define\_singleton\_method(rb\_cAddrInfo, “list\_ipaddr”,  
addrinfo\_s\_list\_ipaddr, 0);
- /\* constants \*/  
mConst = rb\_define\_module\_under(rb\_cSocket, “Constants”);  
init\_constants(mConst);  
Index: ext/socket/extconf.rb  
===================================================================  
— ext/socket/extconf.rb (revision 21486)  
+++ ext/socket/extconf.rb (working copy)  
@@ -258,6 +258,12 @@ unless getaddr\_info\_ok and have\_func("ge  
have\_header(“resolv.h”)  
end

# +have\_header(“ifaddrs.h”) +have\_func(“getifaddrs”) +have\_header(“sys/ioctl.h”) +have\_header(“sys/sockio.h”) +have\_header(“net/if.h”) + unless have\_type(“socklen\_t”, headers) $defs \<\< “-Dsocklen\_t=int” end Index: test/socket/test\_addrinfo.rb

— test/socket/test\_addrinfo.rb (revision 21486)  
+++ test/socket/test\_addrinfo.rb (working copy)  
@@ -39,6 +39,17 @@ class TestSocketAddrInfo \< Test::Unit::T  
assert\_equal(0, ai.protocol)  
end

- def test\_list\_ipaddr
- begin
- 

```
 list = AddrInfo.list_ipaddr

```

- rescue NotImplementedError
- 

```
 return

```

- end
- list.each {|ai|
- 

```
 assert_instance_of(AddrInfo, ai)

```

- }
- end
- def test\_addrinfo\_predicates  
ipv4\_ai = AddrInfo.new(Socket.sockaddr\_in(80, “192.168.0.1”))  
assert(ipv4\_ai.ip?)

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [January 20, 2009, 12:21pm UTC](https://www.ruby-forum.com/t/addrinfo-list-ipaddr/157570/2 "2009-01-20T12:21:57Z")

</div>

In article [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid),  
Tanaka A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

> e$BDs0F$J$s$G$9$,!“%[%9%H$,;}$C$F$$$ke(B IP e$B%”%I%l%9$N%j%9%H$rJV$9e(B  
> e$B%a%=%C%I$rMQ0U$9$k$N$O$I$&$G$7$g$&$+!#e(B

e$BH?1~$O$"$j$^$;$s$,!"F~$l$^$7$?!#e(B

e$B$J$\*!"%a%=%C%IL\>$ON,$5$J$$$J$IJQ$($Fe(B Socket.list\_ip\_address  
e$B$K$7$^$7$?!#e(B

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [January 21, 2009, 11:50am UTC](https://www.ruby-forum.com/t/addrinfo-list-ipaddr/157570/3 "2009-01-21T11:50:25Z")

</div>

At Tue, 20 Jan 2009 20:19:39 +0900,  
Tanaka A. wrote:

> In article [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid),  
> Tanaka A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:
> 
> > ææ¡ˆãªã‚“ã§ã™ãŒã€ãƒ›ã‚¹ãƒˆãŒæŒã£ã¦ã„ã‚‹ IP ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ãƒªã‚¹ãƒˆã‚’è¿”ã™  
> > ãƒ¡ã‚½ãƒƒãƒ‰ã‚’ç”¨æ„ã™ã‚‹ã®ã¯ã©ã†ã§ã—ã‚‡ã†ã‹ã€‚
> 
> åå¿œã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€å…¥ã‚Œã¾ã—ãŸã€‚
> 
> ãªãŠã€ãƒ¡ã‚½ãƒƒãƒ‰åã¯ç•¥ã•ãªã„ãªã©å¤‰ãˆã¦ Socket.list\_ip\_address  
> ã«ã—ã¾ã—ãŸã€‚

ä¸­èº«ã®ã“ã¨ã§ãªãã¦ã™ã¿ã¾ã›ã‚“ãŒã€ç•¥ã•ãªã„ãªã‚‰ list\_ip\_addresses ã‹ã€  
list ã‚’åè©žã§ä½¿ã£ã¦ ip\_address\_list ã¨ã™ã‚‹ã¨æ–‡æ³•ã®åŽã¾ã‚ŠãŒã„ã„ã¨  
æ€ã„ã¾ã™ã€‚

getifaddrs ã‚’ã‚‚ã˜ã£ã¦ getipaddrs ã¨ã„ã†ã®ã‚‚ã‚ã‚Šã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ã€‚

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [January 21, 2009, 2:15pm UTC](https://www.ruby-forum.com/t/addrinfo-list-ipaddr/157570/4 "2009-01-21T14:15:12Z")

</div>

In article [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid),  
“Akinori MUSHA” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

> e$BCf?H$N$3$H$G$J$/$F$9$\_$^$;$s$,!"N,$5$J$$$J$ie(B list\_ip\_addresses e$B$+!"e(B  
> list e$B$rL\>;l$G;H$C$Fe(B ip\_address\_list e$B$H$9$k$HJ8K!$N\<}$^$j$,$$$$$He(B  
> e$B;W$$$^$9!#e(B

e$B$U$`!#8e\<T$+$J$!e(B

> getifaddrs e$B$r$b$8$C$Fe(B getipaddrs e$B$H$$$&$N$b$"$j$+$b$7$l$^$;$s!#e(B

getifaddrs e$B$H;w$9$.$F$$$k$H;W$$$^$9!#$$$D$NF|$+!“e(B  
Socket.getifaddrs e$B$,M\_$7$/$J$C$?$H$-$KL\>A0$G6lO+$7$?$/$”$j$^e(B  
e$B$;$s!#e(B
