草庐IT

android - Ejabberd:如果在客户端的 resume_timeout 之前发送,Xmpp 消息将被丢弃

coder 2023-09-18 原文

我最近在我的 Arch Linux 机器上从 github 编译了最新的 ejabberd 代码。我是 ejabberd 的新手,所以我可能犯了一个新手错误。

我遇到了一个问题,即在特定情况下数据包无法到达目标客户端。如果消息是在之后客户端断开连接但之前客户端 session 因 resume_timeout 而关闭时发送的,则会发生这种情况。

我已按照此处提到的说明进行操作 https://www.ejabberd.im/faq/tcp , 但我仍然无法处理所有情况。

我的 ejabberd.yml 的相关部分看起来像

listen:
  - 
    port: 5222
    module: ejabberd_c2s
    max_stanza_size: 65536
    resend_on_timeout: true
    resume_timeout: 60
    shaper: c2s_shaper
    access: c2s

  - 
    ## Not sure if resend_on_timeout is required here
    port: 5280
    module: ejabberd_http
    resend_on_timeout: true
    resume_timeout: 60
    http_bind: true

modules:
  ...
  mod_offline:
    access_max_user_messages: max_user_offline_messages
  mod_ping:
    send_pings: true
    ping_interval: 60
    timeout_action: kill

这是对应于客户端 Activity 的 ejabberd 日志的输出:

  1. 客户端 A 不正常地断开连接

    2016-06-19 10:59:51.369 [info] <0.549.0>@ejabberd_c2s:fsm_next_state:2454 Waiting for resumption of stream for 9739937980@gappi.in/Smack`
    
  2. 客户端 B 登录并向 A 发送消息

    2016-06-19 11:00:00.320 [info] <0.510.0>@ejabberd_listener:accept:333 (#Port<0.19876>) Accepted connection 139.162.34.247:41186 -> 139.162.34.247:5222
    2016-06-19 11:00:00.575 [info] <0.559.0>@ejabberd_c2s:wait_for_sasl_response:900 ({socket_state,fast_tls,{tlssock,#Port<0.19876>,#Port<0.19877>},<0.558.0>}) Accepted authentication for echo by undefined from 137
    2016-06-19 11:00:00.715 [info] <0.559.0>@ejabberd_c2s:open_session:1111 ({socket_state,fast_tls,{tlssock,#Port<0.19876>,#Port<0.19877>},<0.558.0>}) Opened session for echo@gappi.in/13353511976792329881266
    2016-06-19 11:00:00.776 [info] <0.559.0>@ejabberd_c2s:handle_enable:2700 Stream management with resumption enabled for echo@gappi.in/13353511976792329881266
    2016-06-19 11:00:00.984 [info] <0.559.0>@ejabberd_c2s:terminate:1778 ({socket_state,fast_tls,{tlssock,#Port<0.19876>,#Port<0.19877>},<0.558.0>}) Close session for echo@gappi.in/13353511976792329881266
    
  3. 由于 resume_timeout,客户端 A session 最终关闭

    2016-06-19 11:00:51.370 [info] <0.549.0>@ejabberd_c2s:terminate:1778 ({socket_state,gen_tcp,#Port<0.19869>,<0.548.0>}) Close session for 9739937980@gappi.in/Smack
    
  4. 客户端A重新登录

    2016-06-19 11:01:14.078 [info] <0.510.0>@ejabberd_listener:accept:333 (#Port<0.19879>) Accepted connection 122.172.241.21:26597 -> 139.162.34.247:5222
    2016-06-19 11:01:14.707 [info] <0.566.0>@ejabberd_c2s:wait_for_sasl_response:900 ({socket_state,gen_tcp,#Port<0.19879>,<0.565.0>}) Accepted authentication for 9739937980 by undefined from 122.172.241.21
    2016-06-19 11:01:14.868 [info] <0.566.0>@ejabberd_c2s:open_session:1111 ({socket_state,gen_tcp,#Port<0.19879>,<0.565.0>}) Opened session for 9739937980@gappi.in/Smack
    2016-06-19 11:01:14.966 [info] <0.566.0>@ejabberd_c2s:handle_enable:2700 Stream management with resumption enabled for 9739937980@gappi.in/Smack
    

根据本指南,https://www.ejabberd.im/faq/tcp ,在 resume_timeout 到期后,未确认的消息应该已由 mod_offline 处理。但这并没有发生。

结果:没有消息到达客户端。

有什么建议吗?

最佳答案

此问题是由于 Ejabberd 中的错误造成的 https://github.com/processone/ejabberd/issues/1160现在已经修复。

关于android - Ejabberd:如果在客户端的 resume_timeout 之前发送,Xmpp 消息将被丢弃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37907190/

有关android - Ejabberd:如果在客户端的 resume_timeout 之前发送,Xmpp 消息将被丢弃的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. Ruby:read_timeout 和 open_timeout 之间的区别 - 2

    标题本身就说明了......read_timeout和open_timeout之间有什么区别? 最佳答案 open_timeout是您愿意等待“打开连接”的时间。在TCP上下文中,在放弃尝试并引发超时错误之前等待握手完成的时间量。read_timeout您可能会猜到,是您愿意等待从连接方接收到某些数据的时间。一个例子可能会清楚地说明这一点:在SOAPoverHTTPoverTCP上下文中(简化):您尝试与服务器建立TCP连接。如果建立连接的时间比open_timeout长,则放弃连接尝试并引发/发出/返回超时错误。如果连接成功,您发

  3. ruby - 在 TCPServer (Ruby) 中,我如何从客户端获取 IP/MAC? - 2

    我想在Ruby的TCPServer中获取客户端的IP地址。以及(如果可能的话)MAC地址。例如,Ruby中的时间服务器,请参阅评论。tcpserver=TCPServer.new("",80)iftcpserverputs"Listening"loopdosocket=tcpserver.acceptifsocketThread.newdoputs"Connectedfrom"+#HERE!HowcanigettheIPAddressfromtheclient?socket.write(Time.now.to_s)socket.closeendendendend非常感谢!

  4. ruby - 如何获得带有 SSL 客户端证书的 HTTPS 请求以与 Ruby EventMachine 一起使用? - 2

    我正在尝试使用RubyEventMachine访问使用SSL证书身份验证的HTTPSWeb服务,但我没有让它工作。我编写了以下简单代码块来对其进行端到端测试:require'rubygems'require'em-http'EventMachine.rundourl='https://foobar.com/'ssl_opts={:private_key_file=>'/tmp/private.key',:cert_chain_file=>'/tmp/ca.pem',:verify_peer=>false}http=EventMachine::HttpRequest.new(url).g

  5. ruby-on-rails - 在 Ruby on Rails 应用程序中使用客户端 SSL - 2

    我正在为需要与API建立SSL连接的客户端开发应用程序。我得到了三个文件;一个信任根证书(.cer)文件、一个中间证书(.cer)文件和一个签名的响应文件。我得到的安装说明与IIS或Javakeytool程序有关;我正在用RubyonRails构建应用程序,所以这两种方法都不是一个选项(据我所知)。证书由运行API服务的组织自签名,看来我获得了客户端证书以相互验证https连接。我不确定如何使用我的应用程序中的证书连接和使用API签名响应文件的作用我读过"Usingaself-signedcertificate"和thisarticleonOpenSSLinRuby但两者似乎都不是很到

  6. ruby - 执行过期异常使 Ruby 线程崩溃,但处理了 Timeout::Error - 2

    任何人都可以解释为什么当对方法的调用看起来像这样时我可能会看到这个堆栈(由HTTParty::post请求引起):beginresponse=HTTParty::post(url,options)rescuelogger.warn("Couldnotpostto#{url}")rescueTimeout::Errorlogger.warn("Couldnotpostto#{url}:timeout")end堆栈:/usr/local/lib/ruby/1.8/timeout.rb:64:in`timeout'/usr/local/lib/ruby/1.8/net/protocol.rb

  7. ruby - 为什么这个启用 SSL 的 Ruby 服务器/客户端测试有效? - 2

    我正在努力在Ruby中创建启用SSL的服务器,以及与服务器一起使用的相应Ruby客户端。为了进行测试,我使用以下命令创建了自己的根CA证书。$:~/devel/ssl-test/ssl/CA$opensslgenrsa-outTestCA.key2048GeneratingRSAprivatekey,2048bitlongmodulus............+++...........................+++eis65537(0x10001)$:~/devel/ssl-test/ssl/CA$opensslreq-new-keyTestCA.key-outTestCA.

  8. 已解决socket.timeout : The read operation timed out - 2

    已解决(pip安装模块超时,利用四种国内镜像源完美解决)WARENTING:Retrying(Retry(total=4,connect=None,read=None,redirect=None,status=None))afterconnectionbrokenby‘ConnectTimeoutError(pip._vendor.urllib3.connection.HTTPSConnectionobjectatOx00001D6OE4F4A940>,‘Connectiontopypi.orgtimedout.(connecttimeout=15)’)’':/simple/pip/socke

  9. ruby-on-rails - 在处理电子邮件回复时,我怎样才能忽略任何电子邮件客户端细节和历史记录? - 2

    我有一个通过IMAP处理传入电子邮件的Rails应用程序。当前使用一种方法来搜索TMail对象的各个部分以查找给定的content_type:defself.search_parts_for_content_type(parts,content_type='text/html')parts.eachdo|part|ifpart.content_type==content_typereturnpart.bodyelseifpart.multipart?ifbody=self.search_parts_for_content_type(part.parts,content_type)ret

  10. ruby-on-rails - Heroku Cedar - 没有安装 Resque 前端的静态 Assets - 2

    我有一个简单的Rails应用程序部署到HerokuCedar堆栈。该应用程序使用Resque并安装了ResqueSinatra前端应用程序,因此我可以监控队列:#routes.rb...mountResque::Server,:at=>"/resque"这很好用,但是当部署到Heroku时,Resquefront-end'sCSS&JavaScript没有被送达。一段Heroku的日志表明它正在返回零字节:...2011-07-13T16:19:35+00:00heroku[router]:GETmyapp.herokuapp.com/resque/style.cssdyno=web.

随机推荐