0

我正在使用 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 网络]。那么问题是如何强制它获取局域网的网络地址,即特定的网络?

4

3 回答 3

0

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

于 2012-04-09T05:43:37.687 回答
0

看看这个建议不要使用并提供更彻底的方法的答案。Dns.GetHostAddresses

不确定,但我认为System.Net.NetworkInformation.IPInterfaceProperties可能在这里感兴趣。

于 2012-04-09T05:44:15.840 回答
0

因此,这就是如何检测正确的 localIP 以传递 TcpListener 构造函数,就像您似乎已经在做的那样:

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

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

  1. ping 一个已知的外部 IP,然后使用操作系统选择的网络适配器(使用 iphlpapi.dll,因此仅支持 windows)。
  2. 使用 NetworkInterface.GetAllNetworkInterfaces() 搜索所有已知的 IP 适配器,并选择 IP 与提供的前缀匹配的一个,例如 192.* 等。

关于如何使用 networkComms.net 的 11 个基本示例也可能很有趣,请点击此处

于 2012-04-09T13:24:05.717 回答