ruby​​中的非阻塞tcp客户端套接字失败

ruby​​中的非阻塞tcp客户端套接字失败

问题描述:

尝试以非阻塞方式创建TCP套接字,但失败。任何想法?ruby​​中的非阻塞tcp客户端套接字失败

$ ruby nonblock_sock.rb 
/home/tom/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/socket.rb:1207:in `__connect_nonblock': Operation now in progress - connect(2) would block (IO::EINPROGRESSWaitWritable) 
    from /home/tom/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/socket.rb:1207:in `connect_nonblock' 
    from nonblock_sock.rb:6:in `<main>' 

这里是代码片段

#not working yet, 
require 'socket' 

socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0) 
sockaddr = Socket.pack_sockaddr_in(80, 'localhost') 
socket.connect_nonblock(sockaddr); 

将其更改为:

require 'socket' 
socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0) 
sockaddr = Socket.pack_sockaddr_in(80, '127.0.0.1') #this 
socket.connect_nonblock(sockaddr) 

如果我没有记错,一个需要通过IP而不是主机名(localhost),而creating address的。 因此,connect_nonblock应该在背景中以无阻碍的方式连接EINPROGRESS,我认为我们可以在以后使用IO.select进行检查。

编辑IO::EINPROGRESSWaitWritable如预期的那样增加。 connect_nonblock将连接建立过程留给后台并引发。

你应该处理这样的:

begin 
    socket.connect_nonblock(sockaddr) 
rescue Errno::EINPROGRESS 
    IO.select(nil, [socket]) #wait for socket to be writable 
    begin 
    socket.connect_nonblock(sockaddr) 
    rescue Errno::EISCONN 
    #=> This means connection to remote host has established successfully. 
    socket.write("stuff") 
    end 
end 
+0

改变'localhost1'到'127.0.0.1'得到了同样的错误。谢谢。 – packetie

+0

的意图。我的错。请再次仔细阅读你的错误。更新了我的答案。查看编辑部分。 – kiddorails

+0

谢谢@kiddorails它有帮助! – packetie