boost:asio IPv4 地址和 UDP 通信

2024-04-17

问题已解决 - 请参阅底部的解决方案说明

我正在尝试构建一个简单的应用程序来测试支持以太网的微控制器。我想做的就是发送和接收小 UDP 数据包。该代码使用 boost::asio 进行网络连接,并且非常简单。为了调试,我将所有初始化移出构造函数,以便我可以检查每个步骤。这是我的东西的主体:

    boost::system::error_code myError;

    boost::asio::ip::address_v4 targetIP;
    targetIP.from_string("10.1.1.75", myError);                 // Configure output IP address. HACKHACK--Hardcoded for Debugging
    std::cout << "GetIP - " << myError.message() << std::endl;
    std::cout << "IP: " << targetIP << std::endl;

    boost::asio::ip::udp::endpoint myEndpoint;                  // Create endpoint on specified IP.
    myEndpoint.address(targetIP);
    myEndpoint.port(0x1000);
    std::cout << "Endpoint IP:   " << myEndpoint.address().to_string() << std::endl;
    std::cout << "Endpoint Port: " << myEndpoint.port() << std::endl;

    boost::asio::io_service io_service;                         // Create socket and IO service, bind socket to endpoint.
    udp::socket socket(io_service);
    socket.open( myEndpoint.protocol(), myError );
    std::cout << "Open - " << myError.message() << std::endl;
    socket.bind( myEndpoint, myError );
    std::cout << "Bind - " << myError.message() << std::endl;

    char myMessage[] = "UDP Hello World!";                      // Send basig string, enable socket level debugging.
    socket.send(boost::asio::buffer(myMessage, sizeof(myMessage)), boost::asio::socket_base::debug(true), myError);
    std::cout << "Send - " << myError.message() << std::endl;

    boost::array<char, 128> recv_buf;                           // Receive something (hopefully an echo from the uP)
    udp::endpoint sender_endpoint;
    size_t len = socket.receive_from( boost::asio::buffer(recv_buf), myEndpoint );
    std::cout.write(recv_buf.data(), len);

障碍就在一开始就发生了。 address_v4 不想接受我传递给它的 IP。该应用程序的输出是:

GetIP - The operation completed successfully
IP: 0.0.0.0
Endpoint IP:   0.0.0.0
Endpoint Port: 4096
Open - The operation completed successfully
Bind - The operation completed successfully
Send - A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied

我假设发送错误是由于address_v4设置不正确,但我想不出有什么理由会发生这样的事情。

对于那些在家玩的人来说,我的电脑有双以太网卡,其中一张已被 DHCP 指定为 10.1.1.7,因此目标 IP 应该无需任何路由即可访问。我在 32 位 Win7 和 MSVS 10 上使用 BOOST 1.46.1。当我尝试 IP 时,它也会失败127.0.0.1,如果我错了,请纠正我,但这应该适用于这种情况下的环回?

编辑更新:

因此,感谢之前的回答,我已将 IP 地址添加到我的address_v4,当我打算使用 connect 时,我不再尝试绑定。代码中发生显着变化的部分是 TX,现在看起来像:

    socket.open( targetEndpoint.protocol(), myError );
    std::cout << "Open - " << myError.message() << std::endl;
    char myMessage[] = "UDP Hello World!";                      // Send basig string, enable socket level debugging.
    socket.send_to(boost::asio::buffer(myMessage, sizeof(myMessage)), targetEndpoint, boost::asio::socket_base::debug(true), myError);
    std::cout << "Send - " << myError.message() << std::endl;

(我将 myEndpoint 重命名为 targetEndpoint 以帮助减少混乱......)

我现在在尝试发送时收到错误:
The attempted operation is not supported for the type of object referenced
此时我会给我的长子提供信息丰富的错误消息!无论我使用哪个目标端口,错误都是一致的。我唯一能想到的是我需要在某个地方设置源端口,但我不知道如何在任何地方做到这一点boost::asio文档。

最终决议

我已经成功地完成了这项工作,所以我将把我在一个漂亮的整洁列表中发现的问题发布给那些偶然发现这个答案并与我有类似问题的人。我认为我遇到的主要问题是没有一个 boost 示例显示如何连接到指定的 IP,它们都使用解析器。这让我更难理解这些例子。

  • 当使用from_string调用转换文本IP,使用下面第一个答案中的语法而不是我上面的语法!
  • 设置UDP套接字时,操作顺序至关重要!如果您不想在构造函数中执行此操作,则需要:

    1. 使用所需的协议打开套接字。
    2. 将套接字绑定到本地端点,该端点指定sourceUDP 端口号。
    3. 将套接字连接到指定的远程端点目的地IP 和端口号。

    连接后尝试绑定将导致绑定失败。传输将运行得很好,但您的数据包将从任意端口号发送。

  • 使用send方法来实际传输。不要尝试使用以下命令启用调试数据boost::asio::socket_base::debug(true)!所有这个标志似乎所做的都是在其他功能发送中导致错误消息!

我还想告诉大家,在整个练习中我最有价值的调试工具是 Wireshark。也许这只是因为我在处理这样的通信时习惯了使用 CRO 或协议分析器,但我发现能够看到在线字节显示可以帮助我整理出一大堆我想要的东西。否则永远不会被追踪到。

为您在 IP 问题上的帮助干杯,并帮助我认识到连接和绑定之间的区别。


您当前看到的问题似乎是您对这一行的使用:

targetIP.from_string("10.1.1.75", myError); 

boost::asio::ip::address::from_string是一个静态函数,它返回一个构造的ip::address目的。将其更改为如下所示:

targetIP = boost::asio::ip::address::from_string("10.1.1.75", myError); 

并且您的 IP 地址应该正确填充。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boost:asio IPv4 地址和 UDP 通信 的相关文章

随机推荐

  • PUT Ajax 请求

    我是 Ajax 请求的新手 并整理了以下内容Pastie http pastie org 3394114 第 107 行是我的 PUT 并在 firebug 中抛出一个错误 表明 PUT 不起作用 至于ajax请求 我知道这是错误的 但是我
  • 安西布尔。覆盖单个字典键[重复]

    这个问题在这里已经有答案了 我使用 ansible 来管理生产和 vagrant box 的配置 我有带有默认值的文件 组变量 全部 env prod wwwuser www data db root pwd root pwd pdo dr
  • 11秒删除SQL Server中的240行

    我正在运行删除语句 DELETE FROM TransactionEntries WHERE SessionGUID SessionGUID 删除的实际执行计划是 Execution Tree Clustered Index Delete
  • 复杂的设计模式 - 重叠透明形状?

    我正在尝试创建以下形状 我几乎尝试通过以下方式创建此图像 为了使用 HTML 和 CSS 创建此图像 我尝试使用以下代码 left1 float left transform rotate 180deg halfCircleRight1 h
  • 按下某个键时仅增加 1

    我想在按下 s 键时将变量 shot pressed 增加一 无论我按下多长时间 但结果是变量不断增大 我按下的时间越长 变量的值就越大 下面是我的代码的一部分 import keyboard shot pressed 0 if keybo
  • 忘记我网站的wp-admin密码

    我在Azure上部署了Wordpress 但忘记了我网站的wp admin密码 有什么办法可以恢复吗 find phpmyadmin if you have one and from there on the left side you c
  • 如何在 Nuxt 3 中使用 useQuery() 作为 API 路由参数?

    我正在遵循一个指南 其中api routes是这样构建的 1 创建server api route js file export default defineEventHandler event gt return message hell
  • 为 Windbg 获取正确的 .net 本机符号

    我正在做一些故障转储调试 我正在查找从生产服务器获取的转储 我运行 WinDbg 的机器必须安装有稍微不同版本的 NET 运行时 我在加载 NET 系统程序集的本机映像时遇到错误 因此无法加载 System Data Linq 确保我的调试
  • Django/python 如何从对象列表中获取 id 列表

    如果我有一个通过某些查询获取的对象列表 在本例中为 Django 模型 friends Friend objects friends user1 如何获取 id 列表 以便我可以使用它来搜索另一个模型 如下所示 items Item obj
  • 为 ActionMailer 渲染不同的视图(模板)

    我正在尝试对 ActionMailer Rails 3 1 1 中的不同模板进行条件渲染 我希望大多数用户都能正常使用welcome html erb模板 但有些用户得到特殊welcome photographer html erb模板 这
  • 如何在 mongodb 中取消设置后删除值为 null 的数组字段

    我在 mongo 中取消设置了一个数组字段 但该字段的值为 null 问题是 如何去除 喜欢这张图片https i stack imgur com O2WiV png https i stack imgur com O2WiV png 你可
  • Scikit-learn Ridge 分类器:提取类概率

    我目前正在使用 sklearn 的 Ridge 分类器 并且希望将此分类器与 sklearn 和其他库中的分类器集成 为了做到这一点 理想的做法是提取给定输入属于类列表中每个类的概率 目前 我正在使用 model decision func
  • 如何在 `git rm abc.c` 之后恢复文件?

    我应该删除另一个文件git rm abc c 但我删错了 我怎样才能恢复它 现在 当我发出git status 它说 deleted abc c 顺便说一句 我现在还有其他未提交的更改 您需要执行两个命令 第一个命令将 取消暂存 文件 将其
  • 无法使用 mono 命令提示符为 gtk# 编译 hello.cs

    本来希望this https stackoverflow com questions 8835352 cannot compile gtk example会有所帮助 但会出现不同的错误 尝试将以下内容编译为 hello cs using G
  • 将 CloudTrail 日志导入 Logstash

    我正在尝试将日志从 CloudTrail 获取到 ElasticSearch 中 以便我们可以更好地了解 AWS 账户中发生的情况 我已经在我的机器 Ubuntu 14 04 上设置了 Logstash 和 ElasticSearch 并且
  • 在 Django 中,如何查找属于字符串一部分而不是包含该字符串的术语?

    例如 我的表中两个字段下有三行 如下所示 id name 1 brown cat 2 black dog 3 person 这里出现了一个字符串 或者一个句子 A brown cat jumps over a person 我如何使用这个字
  • 如何让 python setuptools 找到顶级模块

    我有一个包 其结构 简化 如下所示 mypackage init py setup py module1 py module2 py mysubpackage init py mysubmodule1 py mysubmodule2 py
  • 如何在 Jenkins 管道中的 zip 文件管道实用程序插件中排除 Jenkinsfile 和自动化脚本

    我在詹金斯的工作区结构如下图所示 automation scripts dist assets datasim images icons node modules src config pm2 json package json 在上面的目
  • 这段用于确定圆和线段是否相交的代码正确吗?

    显然很难找到一条线是否存在的答案segment和圆相交 例如 如果你用谷歌搜索 你会发现这个问题 https stackoverflow com questions 1073336 circle line segment collision
  • boost:asio IPv4 地址和 UDP 通信

    问题已解决 请参阅底部的解决方案说明 我正在尝试构建一个简单的应用程序来测试支持以太网的微控制器 我想做的就是发送和接收小 UDP 数据包 该代码使用 boost asio 进行网络连接 并且非常简单 为了调试 我将所有初始化移出构造函数