当所有具有相同IP地址的端口时,指定用于UDP写入的以太网端口

时间:2015-03-19 13:29:41

标签: sockets c++11 networking udp winsock2

我正在开发一个应用程序,它有一个带有4个NIC端口的服务器,要为所有NIC配置相同的静态IP地址192.168.0.1,并与4个单独的黑盒子通信,每个黑盒子都有相同的每个盒子上的静态IP地址也是192.168.0.2。与黑匣子通信的唯一区别是端口号,例如方框1将使用端口2010来收听我的数据,而方框2将使用2020,方框3将使用2030,依此类推如端口2110,2120,2130等那样发送回服务器的盒子的模式。服务器和黑匣子之间的接线接口是一对一的,中间没有任何开关或集线器。这意味着以太网端口eth1直接进入方框1,eth2进入方框2,依此类推。

在我的应用程序设计中,我将针对每个端口使用单独的套接字实例进行不同的威胁。我不确定的一件事是如何指定套接字应该使用哪个以太网接口?我已经阅读了其他威胁中的bind(),因为可以指定源和端口的IP地址并将它们绑定到套接字,让底层确定要使用的实际以太网适配器。因为我将使用数据报UDP数据包,这些数据报只是在网络上发送而不管客户端是否正在侦听,所以我认为ip / port的解析不起作用,我也不想垃圾邮件与非目标网络数据包因为已经丢失了数据流。此外,这将使用winsock2在Windows环境中使用C ++ 11编写。

如何在这种情况下指定用于特定套接字的eth接口/适配器?

对于那些会问我为什么这样做的人,我别无选择,因为它是一个外部供应商的黑匣子硬件,我无法控制指定不同的IP地址。

2 个答案:

答案 0 :(得分:1)

您可以这样做,但不能使用套接字,甚至不能使用主机的网络协议栈。

但您可以使用winpcap,tun / tap或slirp等机制从特定接口发送和接收完整数据包。实际上,正确的网络测试无论如何都需要这样做,因为您需要测试对等方处理格式错误的数据包的能力,主机网络堆栈永远不会生成这些数据包。

基本观察,你的任务基本上等同于在用户模式下实现桥接,虽然你没有从桥学习表中选择接口,其余的是相同的。因此,请查看一些在Win32上执行用户模式桥接的软件,例如coLinux

如果您的需求文档实际上说它将使用Winsock2完成,那么在您有任何进步希望之前,您需要努力改变。 (这就是为什么要求应该指定目标,而不是手段。)

答案 1 :(得分:0)

你试图用软件做这件事,让自己暴露在七级地狱之中。

恕我直言,最简单的解决方案是在四个网段上分别设置一个简单的双网卡网关盒,从每个物理端口上单独配置的子网转换为每个黑盒子上的(隐藏)重复地址。 / p>
+----------+                  +-------+                  +-------+
|          | 172.16.n.1       |       | 192.168.0.1      |       |
|   NIC n  +------------------+  NAT  +------------------+   BB  |
|          |       172.16.n.2 |       |      192.168.0.2 |       |
+----------+                  +-------+                  +-------+

NAT盒必须代理发送到192.168.0.1的数据包,就好像它们来自172.16.n.2(或者配置为将172.16.n.1作为目标目标地址),你需要端口转发配置为将入站数据包转发到172.16.n.2到隐藏的192.168.0.2。