为什么 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
.
什么时候 boost::asio::udp::socket::async_send_to
会因 Operation not permitted
和
而失败
async_send_to
失败后我该怎么办,我不能忽略这个错误,这个错误后io循环似乎停止了。
可能是
- 防火墙拒绝您的数据包。尝试禁用它(例如 conntrack/iptables)。
- 缺乏节奏(给定目的地的 UDP 流量过多)。参见 http://www.archivum.info/comp.protocols.tcp-ip/2009-05/00128/Re-UDP-socket-amp-amp-sendto-amp-amp-EPERM.html
是的,你的函数 returns 在遇到错误时没有发布任何更多的异步工作。如果这不是您想要的,只需删除 return
语句即可。
我不建议您重试,因为
- 它可能会一直失败
- 即使是未失败的消息也可能永远不会收到 (UDP)
我使用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
.
什么时候
boost::asio::udp::socket::async_send_to
会因Operation not permitted
和 而失败
async_send_to
失败后我该怎么办,我不能忽略这个错误,这个错误后io循环似乎停止了。
可能是
- 防火墙拒绝您的数据包。尝试禁用它(例如 conntrack/iptables)。
- 缺乏节奏(给定目的地的 UDP 流量过多)。参见 http://www.archivum.info/comp.protocols.tcp-ip/2009-05/00128/Re-UDP-socket-amp-amp-sendto-amp-amp-EPERM.html
是的,你的函数 returns 在遇到错误时没有发布任何更多的异步工作。如果这不是您想要的,只需删除
return
语句即可。我不建议您重试,因为
- 它可能会一直失败
- 即使是未失败的消息也可能永远不会收到 (UDP)