lib/jrpc/transport/socket_tcp.rb in jrpc-1.1.6 vs lib/jrpc/transport/socket_tcp.rb in jrpc-1.1.7
- old
+ new
@@ -65,19 +65,28 @@
end
def build_socket
host = @server.split(':').first
addr = Socket.getaddrinfo(host, nil)
- sock = Socket.new(Socket.const_get(addr[0][0]), Socket::SOCK_STREAM, 0)
- set_timeout_to(sock, Socket::SO_RCVTIMEO, @connect_timeout) if @connect_timeout
- sock
+ Socket.new(Socket.const_get(addr[0][0]), Socket::SOCK_STREAM, 0)
end
def connect_socket
host, port = @server.split(':')
addr = Socket.getaddrinfo(host, nil)
full_addr = Socket.pack_sockaddr_in(port, addr[0][3])
- socket.connect(full_addr)
+
+ begin
+ socket.connect_nonblock(full_addr)
+ rescue IO::WaitWritable => _
+ if IO.select(nil, [socket], nil, @connect_timeout)
+ socket.connect_nonblock(full_addr)
+ else
+ clear_socket!
+ raise ConnectionFailedError, "Can't connect during #{@connect_timeout}"
+ end
+ end
+
rescue Errno::EISCONN => _
# already connected
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ETIMEDOUT, Errno::EPIPE => e
clear_socket!
raise ConnectionFailedError, "#{e.class} #{e.message}"