Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 指定当所有端口都具有相同的IP地址时,用于UDP写入的以太网端口_Sockets_C++11_Networking_Udp_Winsock2 - Fatal编程技术网

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

Sockets 指定当所有端口都具有相同的IP地址时,用于UDP写入的以太网端口,sockets,c++11,networking,udp,winsock2,Sockets,C++11,Networking,Udp,Winsock2,我正在开发一个应用程序,该应用程序有一台带有4个NIC端口的服务器,这些端口将为所有NIC配置为192.168.0.1的相同静态IP地址,并与4个单独的黑匣子通信,每个黑匣子上的静态IP地址也为192.168.0.2。与黑匣子之间通信的唯一区别是端口号,如方框1将使用端口2010来监听我的数据,而方框2将使用2020,方框3将使用2030等等,方框传输回服务器的模式与端口2110、2120、2130等类似。服务器和黑匣子之间的接线接口是一对一的,中间没有任何交换机或集线器。这意味着以太网端口et

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

在我的应用程序设计中,我将有不同的威胁,每个端口都有不同的套接字实例。我不确定的一件事是如何指定套接字应该使用哪个以太网接口?我在其他威胁中读过关于
bind()
,因为可以指定源和端口的IP地址,并将它们绑定到套接字,让底层决定要使用的实际以太网适配器。由于我将使用数据报UDP数据包,无论客户端是否在侦听,这些数据包都会在网络上发送,因此我假设ip/端口的解析在这里不起作用,我也不想用非目的数据包向网络发送垃圾邮件,因为网络上的数据流已经丢失。此外,这将在Windows环境中使用winsock2在C++11下编写

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


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

你试图在软件中这样做,将自己暴露在七个级别的地狱中

在IMHO中,最简单的解决方案是在四个网段中的每一个网段上放置一个简单的双NIC网关框,该网段将从每个物理端口上单独配置的子网转换为每个黑匣子上的(隐藏的)重复地址

+----------+                  +-------+                  +-------+
|          | 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。

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

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

根据基本观察,您的任务本质上等同于在用户模式下实现桥接,尽管您不是从桥接学习表中选择接口,其余的都是相同的。例如,看看一些在Win32上进行用户模式桥接的软件


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

您不能至少在链接到每个黑盒的一侧使用不同的IP地址吗?整件事听起来有点乱,伊姆霍。如果有四个单独的接口都在同一子网中,更不用说地址完全相同,这会让本地机器非常混乱。这似乎是一个糟糕的设计,NIC不可能有不同的地址吗?@pita(太贴切了!)您可以控制黑匣子发送数据包的目标地址吗?似乎您已经可以控制端口了?在Linux下,可以使用
struct ifreq
(netdevice的一部分)定义以太网适配器。只是想知道windows中是否存在类似的东西?不,没有。Winsock只能将套接字绑定到IP地址。例如,Linux也可以绑定到特定的设备/接口。@Ben Voigt。我没有需求文档本身(有限制),但我认为winpcap选项可能是我将进一步研究的内容。谢谢你的洞察力!