为什么 boost::asio::udp::socket::async_send_to 因“不允许操作”而失败,我应该如何处理它

Why boost::asio::udp::socket::async_send_to fail with `Operation not permitted` and how should i handle it

我使用boost::asio在android平台上发送udp包是这样的:

void SendMessage(Message message, const ip::udp::endpoint& endpoint) {
    bool write_in_progress = !send_queue_.empty();
    send_queue_.emplace(std::make_pair(std::move(message), endpoint));

    if (!write_in_progress) {
        DoSendMessage();
    }
}

void DoSendMessage() {
    service_info_publisher_.async_send_to(
            boost::asio::buffer(send_queue_.front().first),
            send_queue_.front().second,
            std::bind(&ServicePublisher::OnMessageSent,
                      this,
                      std::placeholders::_1));
}

void OnMessageSent(const boost::system::error_code& error) {
    auto& message = send_queue_.front();
    LOGI(kTag,
         "OnMessageSent: content: [{}], dest: [{}:{}]",
         fmt::StringRef((char*) message.first.data(), message.first.size()),
         message.second.address().to_string(),
         message.second.port());

    if (error) {
        LOGE(kTag, "fail to send message, error: [{}]", error.message());
        return;
    }

    send_queue_.pop();
    if (!send_queue_.empty()) {
        DoSendMessage();
    }
}

boost::asio::udp::socket::async_send_to 将在发送成功消息后失败。错误消息是:Operation not permitted.

  1. 什么时候 boost::asio::udp::socket::async_send_to 会因 Operation not permitted

  2. 而失败
  3. async_send_to失败后我该怎么办,我不能忽略这个错误,这个错误后io循环似乎停止了。

  1. 可能是

  2. 是的,你的函数 returns 在遇到错误时没有发布任何更多的异步工作。如果这不是您想要的,只需删除 return 语句即可。

    我不建议您重试,因为

    • 它可能会一直失败
    • 即使是未失败的消息也可能永远不会收到 (UDP)