gpt4 book ai didi

ruby - 无法使套接字接受非阻塞 ruby​​ 2.2

转载 作者:行者123 更新时间:2023-12-03 11:59:59 24 4
gpt4 key购买 nike

我整天都在寻找套接字接受非阻塞。我发现 recv 没有阻塞,但无论如何这对我没有好处。我的脚本首先启动一个新的套接字类。它使用 ip 127.0.0.1 和端口 6112 绑定(bind)到客户端。然后它启动多线程。多线程需要@sock.accept。 << 那是阻塞。然后我使用了accept_nonblock。但是,这会给我带来以下错误:

 IO::EWOULDBLOCKWaitReadable : A non-blocking socket operation could not be completed immediately. - accept(2) would block 

我正在使用 Ruby 2.2。
注意:我不打算使用 Rails 来解决我的问题,或者给我一个捷径。我坚持使用纯 Ruby 2.2。
这是我的脚本:
require 'socket'
include Socket::Constants
@sock = Socket.new(AF_INET, SOCK_STREAM, 0)
@sockaddr = Socket.sockaddr_in(6112, '127.0.0.1')
@sock.bind(@sockaddr)
@sock.listen(5)
Thread.new(@sock.accept_nonblock) do |connection|
@client = Client.new(ip, connection, self)
@clients.push(@client)
begin
while connection
packet = connection.recv(55555)
if packet == nil
DeleteClient(connection)
else
@toput = "[RECV]: #{packet}"
puts @toput
end
end
rescue Exception => e
if e.class != IOError
line1 = e.backtrace[0].split(".rb").last
line = line1.split(":")[1]
@Log.Error(e, e.class, e.backtrace[0].split(".rb").first + ".rb",line)
puts "#{ e } (#{ e.class })"
end
end
def DeleteClient(connection)
@clients.delete(@client)
connection.close
end

最佳答案

http://docs.ruby-lang.org/en/2.2.0/Socket.html#method-i-accept_nonblock
accept_nonblock当它不能立即接受连接时引发异常。您应该抢救这个异常,然后 IO.select socket 。

begin # emulate blocking accept
client_socket, client_addrinfo = socket.accept_nonblock
rescue IO::WaitReadable, Errno::EINTR
IO.select([socket])
retry
end

一个补丁有 recently been accepted这将添加一个 exception: false accept_nonblock 的选项,这将允许您在不使用流控制异常的情况下使用它。不过我不知道它已经发货了。

关于ruby - 无法使套接字接受非阻塞 ruby​​ 2.2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29858113/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com