Ruby 中的套接字超时



我有以下代码基本上使用 SSL 侦听端口 443(从这里的另一个问题复制(: 如何获取导致错误的已关闭 SSL 连接的信息?

#!/usr/bin/env ruby
require "socket"
require "openssl"
cert_path = Dir["/etc/letsencrypt/live/example.com/fullchain.pem"].first
key_path = Dir["/etc/letsencrypt/live/example.com/privkey.pem"].first
chain_path = Dir["/etc/letsencrypt/live/example.com/chain.pem"].first
context = OpenSSL::SSL::SSLContext.new
context.cert = OpenSSL::X509::Certificate.new( File.read( cert_path ))
context.key = OpenSSL::PKey::RSA.new( File.read( key_path ))
context.extra_chain_cert = [ OpenSSL::X509::Certificate.new( File.read( chain_path )) ]
port = 443
t = TCPServer.new( port )
s = OpenSSL::SSL::SSLServer.new( t, context )
begin
r = s.accept
rescue
# get client ip here
p r.methods.sort
end

客户端通过 post 请求向服务器发送信息,代码在此处运行超过 35 分钟,然后将有关操作的结果发送回客户端。该呼叫是阻塞的,我需要这种方式。

问题是,如果代码运行超过 30 分钟,则服务器代码无法发回信息。如果在 30 分钟内,那么它可以没有任何问题。操作系统是 Linux(Ubuntu 18 x64(,我一直使用 netstat 检查套接字,它们一直存在,直到程序结束,状态为 ESTABLISHED 状态,这里没有可疑的事情。

我认为它必须使用某种系统超时值做一些事情。从我设置的所有超时到HTTP对象(打开,读取,keep_alive,继续,写入,ssl(的post调用中,仍然没有运气,结果没有返回客户端。

您能给我任何提示,说明什么设置可能导致此问题吗?谢谢。


编辑:

我已经在没有SSL层的情况下测试了我的代码,并且没有超时问题。我还测试了上面 Contex 对象的超时和ssl_timeout属性,但没有任何结果。仍在寻找一种设置来避免SSL层超时引起的问题。


编辑:

我已经在客户端使用 Python3 而不是 Ruby (2.6( 通过 SSL 测试了调用,并且发生了同样的问题。服务器端有 Ruby。因此,要么是OpenSSL的Ruby实现导致了它,要么是OpenSSL本身。


编辑:

新进展:我注意到在同一主机上通过SSL启动该过程没有问题,因此我认为我的托管服务提供商可能会对较长的连接进行一些限制。


编辑:

解决。我从来没有这么想过,但我的ISP与我较长连接的时间限制问题有关。

我已经测试过了,我的ISP与我较长连接的时间限制问题有关。

最新更新