c++ - 通过 Linux 套接字接收多台主机的数据

标签 c++ c linux sockets

我有一个很奇怪的问题。最近,我的任务是开发软件来模拟大型(数百个节点及以上)网络。长话短说,我们有一个头端服务器,它通过可预测的 IP 寻址方案通过 Linux 套接字使用广播和单播的混合与每个主机通信。头端将向给定客户端发出请求,并将(有时)接收与所执行命令相关的数据。所有数据/命令都通过 UDP 在明确定义的端口上发送。

现在,出于测试目的,我们想在虚拟环境中使用原始服务器二进制文件并仍然接收合理的数据。例如,我们想向特定节点发出重置命令并收到虚假通知。广播位很简单,因为我只需要收听正确的广播地址并采取相应的行动即可。单播让我卡住了。

问题

是否可以通过单个(或减少的)Linux 套接字接收大量离散主机的 UDP 请求?所有主机都在同一个子网上,所有 IP 地址/主机/网络拓扑都是提前知道的。

期望的输出

最终,我们希望有一个应用程序可以在网络上的主机上运行,​​并根据输入数据报做出响应,就好像它是这些离散的“虚拟化”主机中的每一个一样。

请注意,我并不是要别人为我编写程序。我只是简单地寻找一些关于可以实现这一目标的“工具”的方向。

可能的解决方案

  • RAW 套接字:这很有希望,因为我可以通过 单个套接字并将其发送到工作线程进行处理和 回复。不幸的是,我只收到数据包 发往我的主机 IP 而不是“假”IP。

  • 在 Linux 上滥用 IP 别名,每个主机一个:这似乎是最直接的方法,但感觉就像用火箭筒打鸭子。它还有一个额外的好处,就是看起来像"is"任何其他形式的通信的主机,我只是担心创建 400 多个别名对于我们 Linux 环境的私生子来说可能有点多。更复杂的是,主机会根据配置进行更改,并且可以处于任何状态(启动、关闭、命令处理等)。

出于我们测试的目的,服务器的源代码被视为不可变的。我完全预计在给定的限制条件下这将是不可能的,但有人可能知道如何实现这一点,坦率地说,我以前从未做过此类事情。

提前感谢您的帮助。

最佳答案

就个人而言,我会使用您的第二个选项 - 将所有 IP 地址添加到主机,然后绑定(bind)到 INADDR_ANY 地址。这意味着您可以只使用一个 socket 。

另一种方法是在您的套接字上设置 IP_TRANSPARENT 套接字选项,这将允许您的应用程序绑定(bind)到非本地地址(您可以通过您的机器路由包含这些地址的网络应用程序正在运行)。不过,此方法确实需要每个地址一个套接字。

关于c++ - 通过 Linux 套接字接收多台主机的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20061455/

相关文章:

c++ - "thrift -gen cpp"生成的代码无法在 macOS : 'boost/tr1/functional.hpp' file not found 上编译

c++ - 覆盖变量的链表问题

c - 分配不兼容类型的变量?

c++ - Collat​​z动态算法

linux - 如何在运行 Node.js 的 Raspberry Pi (Debian) 上解决 LIBUSB_ERROR_BUSY

linux - 检索 CPU 使用率

c++ - 将一个 vector 的内容 move 到另一个

c++ - istringstream 不在变量中存储任何内容

C11网络编程

linux - 如果文件路径包含通配符 (*),则创建或复制文件将不起作用