Commit a90d8b8a authored by Tomoyuki Sahara's avatar Tomoyuki Sahara

add Socket.getaddrinfo.

parent b3c6075d
...@@ -139,6 +139,21 @@ class Addrinfo ...@@ -139,6 +139,21 @@ class Addrinfo
attr_reader :protocol attr_reader :protocol
attr_reader :socktype attr_reader :socktype
def _to_array
case @family
when Socket::AF_INET
s = "AF_INET"
when Socket::AF_INET6
s = "AF_INET6"
when Socket::AF_UNIX
s = "AF_UNIX"
else
s = "(unknown AF)"
end
addr, port = self.getnameinfo(Socket::NI_NUMERICHOST|Socket::NI_NUMERICSERV)
[ s, port.to_i, addr, addr ]
end
def to_sockaddr def to_sockaddr
@sockaddr @sockaddr
end end
...@@ -189,35 +204,21 @@ class BasicSocket ...@@ -189,35 +204,21 @@ class BasicSocket
end end
class IPSocket class IPSocket
def self.getddress(host) def self.getaddress(host)
Addrinfo.ip(host).ip_address Addrinfo.ip(host).ip_address
end end
def _ai_to_array(ai)
case ai.afamily
when Socket::AF_INET
s = "AF_INET"
when Socket::AF_INET6
s = "AF_INET6"
when Socket::AF_UNIX
s = "AF_UNIX"
else
s = "(unknown AF)"
end
[ s, ai.ip_port, ai.ip_address, ai.ip_address ]
end
def addr def addr
_ai_to_array(Addrinfo.new(self.getsockname)) Addrinfo.new(self.getsockname)._to_array
end end
def peeraddr def peeraddr
_ai_to_array(Addrinfo.new(self.getpeername)) Addrinfo.new(self.getpeername)._to_array
end end
def recvfrom(maxlen, flags=0) def recvfrom(maxlen, flags=0)
msg, sa = _recvfrom(maxlen, flags) msg, sa = _recvfrom(maxlen, flags)
[ msg, _ai_to_array(Addrinfo.new(sa)) ] [ msg, Addrinfo.new(sa)._to_array ]
end end
end end
...@@ -328,9 +329,16 @@ class Socket ...@@ -328,9 +329,16 @@ class Socket
#def self.accept_loop #def self.accept_loop
# def self.getaddrinfo def self.getaddrinfo(nodename, servname, family=nil, socktype=nil, protocol=nil, flags=0)
# by Addrinfo.getaddrinfo Addrinfo.getaddrinfo(nodename, servname, family, socktype, protocol, flags).map { |ai|
#end ary = ai._to_array
ary[2] = nodename
ary[4] = ai.afamily
ary[5] = ai.socktype
ary[6] = ai.protocol
ary
}
end
#def self.getnameinfo #def self.getnameinfo
#def self.ip_address_list #def self.ip_address_list
......
# Note: most of tests below will fail if UDPSocket is broken.
assert('IPSocket.getaddress') do
l = IPSocket.getaddress("localhost")
assert_true (l == "127.0.0.1" or l == "::1")
end
assert('IPSocket.addr') do
localhost = "127.0.0.1"
s = UDPSocket.new
s.bind(localhost, 0)
port = Addrinfo.new(s.getsockname).ip_port
a = s.addr
assert_equal "AF_INET", a[0]
assert_equal port, a[1]
assert_equal localhost, a[2]
assert_equal localhost, a[3]
s.close
true
end
assert('IPSocket.peeraddr') do
localhost = "127.0.0.1"
server = UDPSocket.new
server.bind(localhost, 0)
port = server.local_address.ip_port
client = UDPSocket.new
client.connect(localhost, port)
a = client.peeraddr
assert_equal "AF_INET", a[0]
assert_equal port, a[1]
assert_equal localhost, a[2]
assert_equal localhost, a[3]
client.close
server.close
true
end
...@@ -133,3 +133,16 @@ assert('Socket.gethostname') do ...@@ -133,3 +133,16 @@ assert('Socket.gethostname') do
assert_true(Socket.gethostname.is_a? String) assert_true(Socket.gethostname.is_a? String)
end end
assert('Socket::getaddrinfo') do
ret = Socket.getaddrinfo("localhost", "domain", Socket::AF_INET, Socket::SOCK_DGRAM)
assert_true ret.size >= 1
a = ret[0]
assert_equal "AF_INET", a[0]
assert_equal 53, a[1]
# documents says it's a hostname but CRuby returns an address
#assert_equal "127.0.0.1", a[2]
assert_equal "127.0.0.1", a[3]
assert_equal Socket::AF_INET, a[4]
assert_equal Socket::SOCK_DGRAM, a[5]
assert_equal Socket::IPPROTO_UDP, a[6]
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment