Ruby中的套接字超时

时间:2020-01-09 12:33:31

标签: ruby sockets timeout

我有以下代码基本上使用SSL在端口443上侦听(此处复制了另一个问题): How can I get info on an already closed SSL connection that caused an error?

#!/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

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

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

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

您能给我什么设置可能导致此问题的提示吗?谢谢。


编辑:

我已经测试了没有SSL层的代码,并且没有超时问题。我还测试了上述Contex对象的timeout和ssl_timeout属性,没有任何结果。仍在寻找设置以避免SSL层超时导致的问题。


编辑:

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


编辑:

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


编辑:

已解决。我从未想过,但是我的ISP与我的长连接的时间限制问题有关。

1 个答案:

答案 0 :(得分:1)

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

相关问题