gpt4 book ai didi

ruby - Ruby 中的非阻塞 SSL 套接字协商。可能的?

转载 作者:太空宇宙 更新时间:2023-11-03 13:17:02 25 4
gpt4 key购买 nike

介绍

我有一个客户端,它与第 3 方服务建立大量 SSL 连接。在某些情况下,第 3 方会在套接字和 ssl 协商过程中停止响应。发生这种情况时,我当前的实现会在超时前连续“坐下”数小时。

为了解决这个问题,我正在尝试实现以下过程:

require 'socket'
require 'openssl'

# variables

host = '....'
port = ...
p12 = #OpenSSL::PKCS12 object

# set up socket

addr = Socket.getaddrinfo(host, nil)
sockaddr = Socket.pack_sockaddr_in(port, addr[0][3])

socket = Socket.new(Socket.const_get(addr[0][0]), Socket::SOCK_STREAM, 0)
socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)

begin
socket.connect_nonblock(sockaddr)
rescue IO::WaitWritable
if IO.select(nil, [socket], nil, timeout)
begin
socket.connect_nonblock(sockaddr)
rescue Errno::EISCONN
puts "socket connected"
rescue
puts "socket error"
socket.close
raise
end
else
socket.close
raise "Connection timeout"
end
end

# negotiate ssl

context = OpenSSL::SSL::SSLContext.new
context.cert = p12.certificate
context.key = p12.key

ssl_socket = OpenSSL::SSL::SSLSocket.new(socket, context)
ssl_socket.sync_close = true

puts "ssl connecting"
ssl_socket.connect_nonblock
puts "ssl connected"

# cleanup

ssl_socket.close
puts "socket closed"

ssl_socket.connect_nonblock 最终将被包装在与 socket.connect_nonblock 相似的结构中。

问题

我遇到的问题是 ssl_socket.connect_nonblock 在运行时引发以下问题:

`connect_nonblock': read would block (OpenSSL::SSL::SSLError)

相反,我希望它像 socket.connect_nonblock 那样引发一个 IO::WaitWritable

我在互联网上搜索了有关此特定错误的信息,但找不到任何特别有用的信息。据我所知,其他人已经使用这种方法取得了成功,所以我不确定我错过了什么。为了完整起见,我发现 ruby​​ 2.2.01.9.3 的结果相同。

非常感谢任何建议!

最佳答案

有同样的问题,我在下面尝试过,它似乎适合我的情况。

ssl_socket = OpenSSL::SSL::SSLSocket.new socket, context
ssl_socket.sync = true

begin
ssl_socket.connect_nonblock
rescue IO::WaitReadable
if IO.select([ssl_socket], nil, nil, timeout)
retry
else
# timeout
end
rescue IO::WaitWritable
if IO.select(nil, [ssl_socket], nil, timeout)
retry
else
# timeout
end
end

关于ruby - Ruby 中的非阻塞 SSL 套接字协商。可能的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30787466/

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