summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTomoyuki Sahara <[email protected]>2013-08-14 09:34:22 +0900
committerTomoyuki Sahara <[email protected]>2013-08-14 09:34:22 +0900
commita9593e1f5774e980fbb24831c9065386a11fbf74 (patch)
treeb6ac7dc868eff589fff4061040a6eba12877a75b
parent76e1017f481b6facb38e7db8af8db61c8afaf751 (diff)
downloadmruby-a9593e1f5774e980fbb24831c9065386a11fbf74.tar.gz
mruby-a9593e1f5774e980fbb24831c9065386a11fbf74.zip
v4/v6 fallback for TCP.
-rw-r--r--mrblib/socket.rb19
1 files changed, 13 insertions, 6 deletions
diff --git a/mrblib/socket.rb b/mrblib/socket.rb
index 4762c00af..58d097e5c 100644
--- a/mrblib/socket.rb
+++ b/mrblib/socket.rb
@@ -70,7 +70,6 @@ class Addrinfo
else
proto = '???'
end
- # how can we get the last part?
"#<Addrinfo: #{inspect_sockaddr} #{proto}>"
else
"#<Addrinfo: #{self.unix_path} SOCK_STREAM>"
@@ -228,11 +227,19 @@ class TCPSocket
if self.is_a? TCPServer
super(host, service)
else
- ai = Addrinfo.getaddrinfo(host, service)[0]
- super(Socket._socket(ai.afamily, Socket::SOCK_STREAM, 0), "r+")
- # XXX: bind(2)
- Socket._connect(self.fileno, ai.to_sockaddr)
- self
+ s = nil
+ e = SocketError
+ Addrinfo.foreach(host, service) { |ai|
+ begin
+ s = Socket._socket(ai.afamily, Socket::SOCK_STREAM, 0)
+ Socket._connect(s, ai.to_sockaddr)
+ super(s, "r+")
+ return
+ rescue => e0
+ e = e0
+ end
+ }
+ raise e
end
end