一尘不染

为应用程序选择众多Internet连接之一

c#

我有一台可以连接几个互联网的计算机。LAN,WLAN,WiFi或3G。所有这些都处于活动状态,并且机器可以使用其中任何一个。

现在,我要告诉我的应用程序使用可用连接之一。例如,我想告诉我的应用程序仅使用WiFi,而其他软件可能使用其他东西。

在我的C#应用​​程序中,我使用类似HttpWebRequest和的类HttpWebResponse

这有可能吗?


阅读 246

收藏
2020-05-19

共1个答案

一尘不染

HttpWebRequest,WebRequest,WebClient等都抽象了一些高级功能。但是,您可以使用TcpClient(使用带本地端点构造函数)或使用套接字并调用Socket.Bind来执行此操作

如果需要使用特定的本地终结点,请使用Bind方法。必须先调用Bind,然后才能调用Listen方法。除非需要使用特定的本地终结点,否则不需要在使用Connect方法之前调用Bind。

绑定到要使用的接口的本地端点。如果您的本地计算机的IP地址的IP地址为192.168.0.10,则使用本地端点将强制套接字使用该接口。默认值是未绑定的(实际上是0.0.0.0),它告诉网络堆栈自动解析您要规避的接口。

这是一些基于安德鲁评论的示例代码。请注意,将0指定为本地端点端口意味着它是动态的。

using System.Net;
using System.Net.Sockets;

public static class ConsoleApp
{
    public static void Main()
    {
        {
            // 192.168.20.54 is my local network with internet accessibility
            var localEndPoint = new IPEndPoint(IPAddress.Parse("192.168.20.54"), port: 0);
            var tcpClient = new TcpClient(localEndPoint);

            // No exception thrown.
            tcpClient.Connect("stackoverflow.com", 80);
        }
        {
            // 192.168.2.49 is my vpn, having no default gateway and unable to forward
            // packages to anything that is outside of 192.168.2.x
            var localEndPoint = new IPEndPoint(IPAddress.Parse("192.168.2.49"), port: 0);
            var tcpClient = new TcpClient(localEndPoint);

            // SocketException: A socket operation was attempted to an unreachable network 64.34.119.12:80
            tcpClient.Connect("stackoverflow.com", 80);
        }
    }
}
2020-05-19