网络选择

时间:2012-04-09 05:05:01

标签: c# networking

我正在使用TcpClient和套接字处理P2P聊天应用程序。

我编写了以下代码来接受tcpclient:

IPAddress[] ip = Dns.GetHostAddresses(Dns.GetHostName());
IPAddress ip_local = Dns.GetHostAddresses(Dns.GetHostName())[0];
// IPAddress ip_local = IPAddress.Parse(ip_local);
TcpListener tcpl = new TcpListener(new IPEndPoint(ip_local, 9277));
while (true)
{
    try
    {
        tcpl.Start();
        TcpClient tcpClient = tcpl.AcceptTcpClient();
        StateObject state = new StateObject();
        state.workSocket = tcpClient.Client;
        tcpClient.Client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
            new AsyncCallback(OnReceive), state);
    }
    catch (Exception ex)
    {

    }
}

问题在于它每次都选择不同的网络[因为我有1个LAN和2个VMWARE网络]。那么问题是如何强制它获取LAN的网络地址,即特定的网络?

3 个答案:

答案 0 :(得分:0)

您正在从DNS主机名中获取本地IP地址。问题可能是一个或两个(但按顺序)自动将其地址注册为主机名。您有几个选项:1)更改DNS主机名以指向正确的地址; 2)具体获取地址,函数GetHostAddresses将IP地址作为参数或主机名。

答案 1 :(得分:0)

this answer建议不要使用Dns.GetHostAddresses,并提供更全面的方法。

不确定,但我认为System.Net.NetworkInformation.IPInterfaceProperties可能会引起人们的兴趣。

答案 2 :(得分:0)

所以这就是如何检测正确的localIP以传递TcpListener构造函数,因为你似乎已经在做了:

TcpListener tcpl = new TcpListener(new IPEndPoint(ip_local, 9277));

这是我们在开源网络框架networkComms.net中解决的一个特别重要的问题。如果你看看第80行here的Getter for LocalIP,有几种方法可以做到:

  1. Ping一个已知的外部IP,然后使用操作系统选择的网络适配器(使用iphlpapi.dll,仅支持Windows)。
  2. 使用NetworkInterface.GetAllNetworkInterfaces()搜索所有已知的IP适配器,并选择IP与提供的前缀匹配的IP地址,例如192. *等。
  3. 如何使用networkComms.net的基本11示例也可能是有意义的,here