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
改变'localhost1'到'127.0.0.1'得到了同样的错误。谢谢。 – packetie
的意图。我的错。请再次仔细阅读你的错误。更新了我的答案。查看编辑部分。 – kiddorails
谢谢@kiddorails它有帮助! – packetie