c++ - UDP 连接总是成功

标签 c++ boost arduino udp boost-asio

我正在使用 Boost ASIO 通过以太网连接到带有以太网屏蔽的 Arduino Nano。这是 Arduino 设置:

#include <EtherCard.h>
ether.staticSetup("10.0.0.4", "10.0.0.1");
ether.udpServerListenOnPort(&callback_function, 1337);

这是我连接到它的 C++ 代码:

标题

#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <boost/system/error_code.hpp>
#include <boost/system/system_error.hpp>

boost::system::error_code error_1;
boost::shared_ptr <boost::asio::io_service> io_service_1;
boost::shared_ptr <boost::asio::ip::udp::socket> socket_1;

初始化

// 1. reset io service      
io_service_1.reset();
io_service_1 = boost::make_shared <boost::asio::io_service> ();

// 2. create endpoint
boost::asio::ip::udp::endpoint remote_endpoint(
    boost::asio::ip::address::from_string("10.0.0.4"), 
    1337
);

// 3. reset socket
socket_1.reset(new boost::asio::ip::udp::socket(*io_service_1));                

// 4. connect socket
socket_1->async_connect(remote_endpoint, socket_1_connect_callback);

// 5. start io_service_1 run thread after giving it work
boost::thread t(boost::bind(&boost::asio::io_service::run, *&io_service_1));    

回调

function socket_1_connect_callback (const boost::system::error_code& error_1)
{
    // 1. check for errors
    if (error_1) 
    {
        std::cerr << "error_1.message() >> " << error_1.message().c_str() << std::endl;
        return;
    }
    else
    {
        INFO << "connection succeeded";
    }   

    return; 
}

socket 每次都会连接,即使 Arduino 未通电。为什么不会连接失败?

最佳答案

根据定义,UDP 是无连接协议(protocol)。 “连接”UDP 套接字只是一种方便的操作,它允许您在该套接字上发送数据报而不指定接收方 - 它使用您提供给连接调用的那个。

但除此之外,它什么都不做。确实没有办法检查是否有人在 UDP 的另一端监听,除非您自己实现请求/响应方案。

您正在使用 Boost.Asio 这一事实并未增加这一基本事实。

关于c++ - UDP 连接总是成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47229176/

相关文章:

c++ - 如何在没有 deadline_timer boost 的情况下将 boost::asio 代码完全转换为 C++11/asio?

arduino - Arduino 中的串行可用始终返回 0

android - 通过 arduino 板从传感器接收数据到 android 设备的最佳方法是什么?

c++ - "break when an exception is void"是什么意思?

c++ - 为什么变量 myOperator 没有显示内存位置,为什么没有正确传递

c++ - 特定 std::bind 返回的数据类型到底是什么?

c++ - boost::any_range<gsl::string_span<>> 在 Release模式下崩溃

c# - 通过C#从Arduino读取串行数据

c++ - Python ctypes : initializing c_char_p()

C++ 在 char(头文件)之前期望主表达式