我使用ForcebindIP 将应用指向特定的网络适配器,如下所示:
forcebindip -i 192.168.0.5 MyCSharpApp.exe
这很好用,而且应用程序不知道(或不访问) PC上的任何其他网络适配器。
是否可以将ForceBindIP
仅限制为出站流量,而让应用程序从任何本地网络适配器接收数据?或者甚至为出站流量指定一个网络适配器,为入站流量指定另一个网络适配器?
我找不到额外的ForceBindIP
启动参数来做这件事。
如果能帮上忙我将不胜感激。
发布于 2020-01-21 12:42:19
如果我没有弄错您的问题,您希望绑定您的应用程序以侦听所有可用接口上的数据包,但只通过一个给定接口将数据包返回给。我还假设它是一个服务器应用程序,您没有neiter源代码,也没有对其行为的控制。
披露:我不知道ForceBindIP内部是如何工作的,我对它的理解是基于网站上的这段话:
然后,它将注入一个动态链接库(BindIP.dll),该动态链接库将WS2_32.DLL加载到内存中,并截获
()、connect()、sendto()、WSAConnect()和WSASendTo()函数,将它们重定向到动态链接库中的代码,该代码验证它们将绑定到哪个接口,如果不是指定的接口,则(重新)绑定套接字
要克服的问题
我不相信仅仅使用一个应用级DLL注入器就可以实现您想要的配置。我将列出ForceBindIP
为使其正常工作而必须克服的几个问题:
listen
to a socket,应用程序必须首先将其bind()为唯一的protocol-address-port
组合。应用程序可以将自己绑定到特定地址或通配符(即侦听所有接口)。显然,可以同时绑定到通配符和特定地址,如this SO question中所述。然而,从应用程序的角度来看,这将是两个不同的套接字。因此你的应用程序必须知道如何处理这种接受客户端连接的traffic.您可以有多个具有不同优先级和规则的gefault网关(这是一个需要探索的完全不同的主题),但据我所知,这不会解决您的特定问题:大多数路由协议都假设链路是对称的,并希望数据包保持在同一接口内。有像asymmetric routing和network interface teaming这样的特殊情况,但它们必须在每个接口级别上实现。
一个潜在的解决方案
实现目标的一种方法(我对您的环境不太了解,无法断言它会工作)将是创建一个virtual interface,将其设置到另一个IP网络,将您的应用程序绑定到它,然后使用防火墙(例如,允许多播数据包进入“虚拟”网络),并使用metric set to 1从该网络路由到所需的默认网关。我还怀疑任何Windows
都不会那么灵活,所以你可能需要一个Server Edition
。
我很抱歉这不是现成的解决方案,但是我希望这能给你更多关于你所面临的问题的背景,并指引你到其他方向去探索。
发布于 2020-01-16 20:05:04
您可以在Powershell中使用Set-NetAdapterAdvancedProperty命令来设置指定适配器的流控制
要获取所有网络适配器的名称和属性:-
Get-NetAdapterAdvancedProperty -Name "*"
假设您希望名为"Ethernet 2“的网络适配器仅用于从internet接收数据,然后键入:-
Set-NetAdapterAdvancedProperty -Name "Ethernet 2" -DisplayName "Flow Control" -DisplayValue "Rx Enabled"
您可以在 https://docs.microsoft.com/en-us/powershell/module/netadapter/set-netadapteradvancedproperty?view=win10-ps中找到更多信息
发布于 2020-01-26 14:52:58
Microsoft winsock示例在他们的示例中有一个用法,用于将套接字限制为仅发送或接收模式。这可能会有帮助。https://docs.microsoft.com/en-us/windows/win32/winsock/complete-client-code
绑定时不会施加出站和入站限制。而是后者或当建立连接时。客户端代码中与此相关的代码行位于末尾。
// shutdown the connection since no more data will be sent
iResult = shutdown(ConnectSocket, SD_SEND);
https://stackoverflow.com/questions/58521809
复制相似问题