为什么这个 Boost ASIO 代码不能与这个 python 客户端一起工作?

2023-12-21

此代码与原始 udp 异步回显服务器相同,但具有不同的套接字。

响应已传输并显示在wireshark 中,但随后会向服务器发送回ICMP 端口不可达错误。我试图理解为什么,因为一切看起来都是正确的。

您可以将此代码直接复制到源文件中,例如服务器.cpp。然后编译

gcc server.cpp -lboost_system

使用如下命令运行它:./a.out 35200

#include <cstdlib>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/asio.hpp>

using boost::asio::ip::udp;
class server
{
public:
  server(boost::asio::io_service& io_service, short port)
    : io_service_(io_service),
      socket_(io_service, udp::endpoint(udp::v4(), port)),
      socket2_(io_service, udp::endpoint(udp::v4(),0))
  {
    socket_.async_receive_from(
        boost::asio::buffer(data_, max_length), sender_endpoint_,
        boost::bind(&server::handle_receive_from, this,
          boost::asio::placeholders::error,
          boost::asio::placeholders::bytes_transferred));
  }

  void handle_receive_from(const boost::system::error_code& error,
      size_t bytes_recvd)
  {
    if (!error && bytes_recvd > 0)
    {
        // use a different socket... random source port.
        socket2_.async_send_to(
            boost::asio::buffer(data_, bytes_recvd), sender_endpoint_,
            boost::bind(&server::handle_send_to, this,
                        boost::asio::placeholders::error,
                        boost::asio::placeholders::bytes_transferred));
    }
    else
    {
      socket_.async_receive_from(
          boost::asio::buffer(data_, max_length), sender_endpoint_,
          boost::bind(&server::handle_receive_from, this,
            boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred));
    }
  }

  void handle_send_to(const boost::system::error_code& /*error*/,
      size_t /*bytes_sent*/)
  {
    // error_code shows success when checked here.  But wireshark shows
    // an ICMP response with destination unreachable, port unreachable when run on
    // localhost.  Haven't tried it across a network.

    socket_.async_receive_from(
        boost::asio::buffer(data_, max_length), sender_endpoint_,
        boost::bind(&server::handle_receive_from, this,
          boost::asio::placeholders::error,
          boost::asio::placeholders::bytes_transferred));
  }

private:
  boost::asio::io_service& io_service_;
  udp::socket socket_;
  udp::socket socket2_;
  udp::endpoint sender_endpoint_;
  enum { max_length = 1024 };
  char data_[max_length];
};

int main(int argc, char* argv[])
{
  try
  {
    if (argc != 2)
    {
      std::cerr << "Usage: async_udp_echo_server <port>\n";
      return 1;
    }

    boost::asio::io_service io_service;

    using namespace std; // For atoi.
    server s(io_service, atoi(argv[1]));

    io_service.run();
  }
  catch (std::exception& e)
  {
    std::cerr << "Exception: " << e.what() << "\n";
  }

  return 0;
}

我需要这个的原因是因为我有多个线程从由 UDP 服务器提供的输入队列接收数据。现在我希望这些线程能够直接发送响应,但我无法让它工作。

如果我在 async_send_to 调用中使用原始套接字(即 socket_),那么它就可以工作。

好的...这是测试客户端,它不适用于上面的代码(但适用于 asio 示例中的原始版本)。

#!/usr/bin/python

import socket, sys, time, struct

textport = "35200"
host = "localhost"

if len(sys.argv) > 1:
    host = sys.argv[1]

print "Sending Data"

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
port = int(textport)
s.connect((host, port))

s.sendall("Hello World")
#s.shutdown(1)

print "Looking for replies; press Ctrl-C or Ctrl-Break to stop."
while 1:
    buf = s.recv(1200)
    if not len(buf):
        break
    print "Received: %s" % buf

让我很困惑。但至少我可以使用 C++ UDP 客户端并且它可以工作。


您不应该挂起异步发送然后关闭套接字。套接字的析构函数在块的末尾运行,关闭套接字,从而防止发送发生。

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

为什么这个 Boost ASIO 代码不能与这个 python 客户端一起工作? 的相关文章

随机推荐

  • 为什么任何 html 按钮都会导致 aspx 页面回发?

    我已在 SharePoint 网站上创建了 aspx 页面 并在页面中插入了 HTML 按钮 Example
  • 自动映射器性能

    我正在使用 Automapper 将我的业务模型映射到 ViewModel 它有效 但速度非常慢 我有一个包含 6893 个对象和 23 个属性的集合 测试环境 生产应该有更多 使用循环需要00 02 32 8118534映射一切 var
  • 从内容脚本引用时,扩展程序中的图像显示为损坏的链接

    我为 Chrome 扩展程序编写了一个小型内容脚本 该脚本在网页中插入图像 但是当我观看处理后的网页时 图像看起来好像链接已损坏 该图像位于我的 Chrome 扩展程序的根目录中 我正在使用扩展 API 中的 getURL 函数 div c
  • 单击透明区域时如何关注 JavaFX 窗口后面的应用程序?

    我正在使用 StageStyle TRANSPARENT 创建一个 JavaFX 舞台 以便我可以完全自定义窗口 我在窗口边框周围创建了自己的阴影效果 请参阅link https stackoverflow com a 25535316 6
  • 移动构造函数应该采用 const 或非 const 右值引用吗?

    在几个地方 我看到了复制和移动构造函数的推荐签名 如下所示 struct T T T const T other T T other 其中复制构造函数采用 const 引用 而移动构造函数采用非 const 右值引用 据我所知 这阻止了我在
  • 如何在Windows中的jcenter bintray中生成gpg签名密钥

    I am unable to get GPG signing keys Please any one tell me Thanks How to generate gps signing keys in windows for jcente
  • 当int被转换为short并被截断时,新值是如何确定的?

    有人可以澄清当整数转换为 a 时会发生什么吗short在C语言中 我正在使用 Raspberry Pi 所以我知道int是 32 位 因此short必须是 16 位 假设我使用以下 C 代码 int x 0x1248642 short sx
  • 如何多次导入自定义任务而不发出警告消息?

    我正在使用 MSBuild Extension Pack MEP 中的一些自定义任务 我的项目分为许多文件 在这些文件中 我使用 在两个 三个文件中两次或三次 导入 MEP 任务 执行此操作时我收到警告消息 如下所示 警告 MSB4011
  • 如何从广播接收器启动下载管理器?

    我的应用程序下载大型 zip 文件 100mb 我使用默认的 DownloadManager 来方便下载 Google API 文档建议注册一个 BroadcastReceiver 并监听 ACTION NOTIFICATION CLICK
  • 在列表中查找模式

    我正在尝试编写一个 python 脚本来查找列表中的模式 例如 鉴于此列表 1 2 3 4 5 6 4 5 6 4 5 6 4 5 6 该脚本将确定 4 5 6 出现了 3 次 然后打印出来 3 4 5 6 我希望是否有人在算法上有任何见解
  • KenBurnsView如何设置图片资源?

    我正在尝试使用Faria 的 KenBurnsView https github com flavioarfaria KenBurnsView我的应用程序中的库 KenBurnsView 是 ImageView 的一些扩展 具有很好的动画效
  • 如何在没有延迟反模式的情况下将 jQuery $.ajax 调用转换为 Bluebird Promise

    现在我在核心文件中使用promise deferred 这使我能够在一个中心位置解决承诺 我一直在读到我可能正在使用反模式 我想了解为什么它不好 所以在我的core js文件我有这样的功能 var getMyLocation functio
  • 在测试复杂行为时,可以在单元测试中使用多个断言吗?

    这是我的具体场景 我有课QueryQueue包裹着QueryTaskArcGIS API for Flex 中的类 这使我能够轻松地将多个查询任务排队执行 呼唤QueryQueue execute 迭代队列中的所有任务并调用它们的执行方法
  • C#(表单)中漂亮的关键名称

    我有一个组合框 其中填充了Keys枚举 winforms 问题是对于没有经验的用户来说按键名称不是很清楚 例如 普通用户可能不知道 OemPipe 或 HanjaMode 的含义 那么 我该如何解决这个问题 并有一些更好的键名呢 我正在考虑
  • 错误:尝试在空上下文对象上调用方法“format”

    春季启动 v1 4 1 Java v1 8 百里香叶 v2 1 5 我认为以下代码行 td td 它的语法是我基于 S O 问题SpringBoot Thymeleaf 序数 https stackoverflow com question
  • DTD——ID属性的唯一性

    根据DTD规范 http www w3 org TR REC xml id关于 ID 属性类型 有效性约束 ID ID 类型的值必须与名称产生相匹配 名字不能 作为此类型的值在 XML 文档中出现多次 即 ID 值必须唯一标识承载它们的元素
  • 如何在 Windows 8 现代应用程序上从视频流中抓取帧?

    我正在尝试从 mp4 视频流中提取图像 查找完内容后 正确的方法似乎是使用 C 中的媒体基础并打开框架 从中读取内容 文档和示例很少 但经过一番挖掘后 似乎有些人已经成功地做到了这一点 通过将帧读入纹理并将该纹理的内容复制到内存可读的纹理
  • ActionMode 回调不起作用

    我正在执行一项任务 我想在文本选择上创建自定义工具提示 意味着我想在工具提示菜单中添加我自己的选项 我使用了下面的代码 它在某些设备中正常工作 如图所示 在菜单 xml中 menu menu
  • 如何在倒计时后删除 Django 对象?

    在我正在开发的平台中 我们希望用户能够为他们创建的对象设置到期时间 在他们设置的倒计时到期后 该对象应该被删除 您建议如何这样做 编辑 我应该澄清的是 每个对象的到期时间都会有所不同 执行您所描述的操作的最常见方法是创建一个列来存储创建时间
  • 为什么这个 Boost ASIO 代码不能与这个 python 客户端一起工作?

    此代码与原始 udp 异步回显服务器相同 但具有不同的套接字 响应已传输并显示在wireshark 中 但随后会向服务器发送回ICMP 端口不可达错误 我试图理解为什么 因为一切看起来都是正确的 您可以将此代码直接复制到源文件中 例如服务器