我正在创建一个使用 ssl Websocket 连接和 ssl Http(保持事件)连接连接到服务器的客户端应用程序,我正在使用 boost::beast 包来执行相同的操作.为了检测死连接,我实现了一个简单的乒乓机制。这些都很好,但是在处理 ping-pong 故障时出现了问题。问题如下:
为了测试我的代码,我连接到远程服务器,发送了一些消息,然后关闭了我的 wifi。正如预期的那样,在一段时间后它检测到它没有收到来自服务器的任何消息,它尝试为 http 连接执行 async_shutdown 并为 websocket 连接执行 async_close .我注意到的第一件事是,在 wifi 恢复之前,这两个调用都会阻塞它们各自的链。
并且在 wifi 启动后,应用程序会尝试在重新连接之前重置流:
void HttpKeepAliveConnection::recreateSocket() { _receivedPongForLastPing = true; _sslContext.reset(new boost::asio::ssl::context({boost::asio::ssl::context::sslv23_client})); _stream.reset(new HttpStream(_ioContext, *_sslContext)); }
并为 websocket 重置 ws 变量:
void WebsocketConnection::recreateSocket() { _receivedPongForLastPing = true; _sslContext.reset(new boost::asio::ssl::context({boost::asio::ssl::context::sslv23_client})); _ws.reset(new WebSocket(_ioContext, *_sslContext)); }
不幸的是,它在 on_connect 或 on_ssl_handshake 失败。以下是我的日志:
156 AsioConnectionBase.cpp:53 (2018-08-06 15:34:38.458536) [0x00007ffff601e700] : Started connect sequence. Connection Name: HttpKeepAliveConn
157 AsioConnectionBase.cpp:122 (2018-08-06 15:34:38.459802) [0x00007ffff481b700] : Failed establishing connection to destination. Connection failed. Connection Name: HttpKeepAliveConn. Host: xxxxxxxxx. Port: 443. Error: Operation canceled
158 APIManager.cpp:175 (2018-08-06 15:34:38.459886) [0x00007ffff481b700] : Received error callback from connection. Restarting connection in a sec. Connection Name: HttpKeepAliveConn
159 AsioConnectionBase.cpp:53 (2018-08-06 15:34:39.460009) [0x00007ffff481b700] : Started connect sequence. Connection Name: HttpKeepAliveConn
160 HttpKeepAliveConnection.cpp:32 (2018-08-06 15:34:39.460515) [0x00007ffff481b700] : Failed ssl handshake. Connection failed.Connection Name: HttpKeepAliveConn. Host: xxxxxxxxx. Port: 443. Error: Bad file descriptor
161 APIManager.cpp:175 (2018-08-06 15:34:39.460674) [0x00007ffff481b700] : Received error callback from connection. Restarting connection in a sec. Connection Name: HttpKeepAliveConn
所以我有两个问题:
boost::beast 中的变量是什么(或者就此而言 boost::asio 因为 boost::beast 是建立在 asio 之上)需要重置几个小时以来一直在尝试调试它。感谢任何帮助
编辑
所以我想出了我错在哪里。 Alan Birtles 和 Vinnie Falco 都是对的。在您的 ping 计时器过期(并且还没有处理程序返回)之后关闭死 ssl 连接的方法是
_stream->lowest_layer().close();
对于网络套接字
_ws->lowest_layer().close();
等待您的一个处理程序(通常是读取处理程序)返回错误(通常是 boost::asio::error::operation_aborted 错误)。从那里,排队开始下一次重新连接。 (不要在第 1 步后立即排队重新连接,这会导致我遇到的内存问题。我知道这是 asio 101,但很容易忘记)
要重置套接字,只需重置流即可
_stream.reset(new HttpStream(_ioContext, _sslContext));
对于网络套接字
_ws.reset(new WebSocket(_ioContext, _sslContext));
最佳答案
我不认为asio::ssl::stream关闭后可以再次使用。
How do we close a connection if internet is down and a proper tcp close is not possible.
简单地允许销毁套接字或流对象。
关于c++ - 断开连接后重新连接 boost beast (asio) websocket 和 http 连接时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51705787/
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案