Winapi Win32套接字-在发送到其他本地接口时强制ip数据包离开物理接口

Winapi Win32套接字-在发送到其他本地接口时强制ip数据包离开物理接口,winapi,sockets,ip,ipv4,loopback,Winapi,Sockets,Ip,Ipv4,Loopback,小结:我试图创建套接字来在同一台机器上存在的两个物理接口之间传递数据,Win32套接字总是直接在内核中转发通信量,而不是通过物理接口。有没有办法禁用此行为,可能是通过设备设置、注册表调整、路由表诡计或套接字选项?我们使用的是WindowsXPSP3 一些背景。我正在尝试构建一些完全自动化的IP测试来测试我们的定制IPv4设备。我们有一个大型的Windows XP机器实验室,每个连接到的设备都有单独的物理以太网接口。我们的设备实际上是以太网路由器,每个路由器都有自己的IP 我们需要通过我们的设备将

小结:我试图创建套接字来在同一台机器上存在的两个物理接口之间传递数据,Win32套接字总是直接在内核中转发通信量,而不是通过物理接口。有没有办法禁用此行为,可能是通过设备设置、注册表调整、路由表诡计或套接字选项?我们使用的是WindowsXPSP3

一些背景。我正在尝试构建一些完全自动化的IP测试来测试我们的定制IPv4设备。我们有一个大型的Windows XP机器实验室,每个连接到的设备都有单独的物理以太网接口。我们的设备实际上是以太网路由器,每个路由器都有自己的IP

我们需要通过我们的设备将数据发送出实验室机器,然后返回到同一台计算机。我们将通过设备发送单播和多播UDP、TCP和广播IP流量

我们希望(并且可能需要)流量源于它预定的同一台机器。 为此,我们在自己的子网中配置两个独立的NIC,每个NIC都有自己的IP,例如NIC#1与10.0.0.1/24和NIC#2与10.0.1.1/24。然后,我们的设备就像简单的直通路由器,有两个接口,一个在10.0.0.0/24子网上,一个在10.0.1.0/24子网上,它们只是来回转发数据包

为了生成数据,我们希望能够使用Win32 sockets,因为它被很好地理解和支持,我们的客户正在使用什么,并且可能是最快速的方法。数据包注入对于UDP和广播IP可能是可行的,但对于TCP很可能不是这样。我会考虑使用数据包注入的想法,但我更喜欢标准的Win32套接字


如总结中所述,数据包从未离开机器。我像疯子一样在谷歌上搜索,但没找到多少。有什么想法吗?

Winsock总是将包数据带到内核空间并在那里处理。这就是通用API的全部要点,任何设备都是在同一“层”处理的。如果你想坚持使用Winsock,我不相信你能(或想)改变这种行为

您可以使用
传输包
传输文件
删除一些缓冲区复制,但不能在两个设备接口之间删除


也就是说,Winsock执行的额外缓冲区处理是否存在性能问题?安全问题?

在不同的虚拟机中运行测试仪的端点如何?然后,您只需要一块硬件,但您将拥有独立的TCP/IP堆栈,它们不知道彼此是本地的(而且大多数虚拟机解决方案都会将数据包直接通过主机传递,没有任何改变,我认为主机不会抓取数据包并将其直接发送到另一个虚拟机,除非您在虚拟机之间配置桥接…但您会将每个虚拟机绑定到不同的物理网络适配器).

使用Windows的命令行路由实用程序。您可以对其进行配置,以便将发送到特定子网上特定IP地址的任何IP数据包发送到另一个IP/设备。例如:

route ADD <NIC_1_IP> MASK <NIC_1_SUBNET> <DEVICE_IP_CONNECTED_TO_NIC_2> METRIC 1
route ADD <NIC_2_IP> MASK <NIC_2_SUBNET> <DEVICE_IP_CONNECTED_TO_NIC_1> METRIC 1
路由添加掩码度量1
路由添加掩码度量1
或者,如果您知道NIC接口的索引号,则可以指定它们:

route ADD <NIC_1_IP> MASK <NIC_1_SUBNET> METRIC 1 IF <NIC_2_INTF>
route ADD <NIC_2_IP> MASK <NIC_2_SUBNET> METRIC 1 IF <NIC_1_INTF>
如果需要,路由添加掩码度量1
如果需要,路由添加掩码度量1
这样,每当一个数据包被发送到NIC#1的IP时,该数据包都会被发送到连接到NIC#2的设备,然后该设备会将其传递到NIC#1。反之亦然,发送到NIC#2的IP的数据包也是如此


例如,如果电脑通过路由器连接到网络,这是一种允许WireShark捕获本地IP流量的有用技术。从一个本地IP/端口到另一个本地IP/端口的数据包可以从路由器反弹回电脑,以便它们通过WireShark可以监视的物理接口传输(WireShark将看到每个本地数据包的副本—一个出站和一个入站—但您可以过滤掉副本).

这是人们建议的和我在搜索中找到的所有选项中效果最好的。我仍然很难让这项功能用于“广播”流量;我需要花更多的时间在这方面,但我感觉我需要Win7附带的IP_UNICAST_IF socket选项(讽刺的是,使用“单播”选项进行广播…)你在说什么?将套接字绑定到感兴趣的NIC的IP上不会正常工作吗?@Hi Angel仅在windows vista之后。在vista之前,它是一个很弱的模型,bind只决定从何处接收,而不是从何处发送。