【问题标题】:Why can boost asio udp connection throw "send: Connection refused"?为什么 boost asio udp 连接会抛出“发送:连接被拒绝”?
【发布时间】:2014-02-12 08:53:44
【问题描述】:

我假设 udp 连接并不真正关心另一端是否有任何对等点,那么为什么提升 asio udp 连接会在socket->send( boost::asio::buffer( data.get(), length ) ); 调用上抛出“发送:连接被拒绝”(我从 Linux 发送到 Windows ,只发送不尝试阅读任何东西)?是网卡错误还是什么原因?

【问题讨论】:

    标签: c++ exception boost udp boost-asio


    【解决方案1】:

    Boost.Asio 抛出一个值为boost::asio::error::connection_refused 的错误,因为底层套接字的send*() 操作返回一个错误代码ECONNREFUSED。根据udp 手册页,send*() 函数可以返回ECONNREFUSED

    socketip 记录的所有错误都可能由UDP 套接字上的发送或接收返回。

    ECONNREFUSED
    没有接收者与目标地址相关联。这可能是由先前通过套接字发送的数据包引起的。

    虽然在无连接协议上收到与连接相关的错误可能很奇怪,但仍允许服务返回检测到的错误。协议的不可靠部分阻止调用者接收到消息已被目的地接收的确认。但是,如果服务知道目的地没有收到消息,这并不排除服务报告连接被拒绝错误。

    【讨论】:

      【解决方案2】:

      使用send_to。毕竟,UDP 是一种无连接协议。

      【讨论】:

      • 我的意思是一段时间后建立连接。在一个连接上的应用程序执行期间,异常来来去去。这意味着我们每秒发送 1 条消息。我们可以发送 100 条消息,然后获得 10 个异常,然后在同一连接上成功发送 1000 条消息。
      • @DuckQueen:多考虑一下,忘记.connect.send,直接使用send_to。是否可以实际连接到 UDP 套接字取决于操作系统,请参阅stackoverflow.com/questions/9741392/…
      • 虽然不直观,UDP 被允许返回 ECONNREFUSED 错误,即使它是无连接协议。
      • @TannerSansbury 它通过 ICMP Destination Unreachable (Port Unreachable) 消息的机制工作。
      猜你喜欢
      • 2021-07-29
      • 2011-04-01
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 2012-05-25
      • 2020-10-17
      • 2011-01-23
      • 1970-01-01
      相关资源
      最近更新 更多