为什么boost :: asio :: udp :: socket :: async_send_to失败并且“操作不允许”以及我该如何处理它

时间:2018-05-30 09:22:34

标签: c++ boost-asio

我使用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

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

1 个答案:

答案 0 :(得分:1)

  1. 可能是

  2. 是的,当您遇到错误时,您的函数将返回而不再发布任何异步工作。如果这不是您想要的,只需删除return语句。

    我不建议您重试相同的原因,因为

    • 它可能会一直失败
    • 甚至可能永远不会收到未发送的消息(UDP)