C#-找到另一个程序实例以通过TCP在同一网络上进行通信的最快方法

时间:2018-07-09 22:47:16

标签: c# arp

我知道并不是所有的设备都响应ICMP或ping,所以最合适的方法似乎是向ARP上的所有IP(从192.168.0.0到192.168.255.255)发送ARP请求,但这意味着请求超过65000个IP,这会花费很多时间。我想找到程序的另一个实例以同步其内容,但是我对ARP方法不满意。到目前为止,我在SO中找到了这些不错的代码:

[DllImport("iphlpapi.dll", ExactSpelling = true)]
public static extern int SendARP(int DestIP, int SrcIP, byte[] pMacAddr, ref uint PhyAddrLen);

static void Main(string[] args)
{
    List<IPAddress> ipAddressList = new List<IPAddress>();

    for (int i = 0; i <= 255; i++)
    {
        for (int s = 0; s <= 255; s++)
        {
            ipAddressList.Add(IPAddress.Parse("192.168." + i + "." + s));
        }
    }

    foreach (IPAddress ip in ipAddressList)
    {
        Thread thread = new Thread(() => SendArpRequest(ip));
        thread.Start();

    }
}

static void SendArpRequest(IPAddress dst)
{
    byte[] macAddr = new byte[6];
    uint macAddrLen = (uint)macAddr.Length;
    int uintAddress = BitConverter.ToInt32(dst.GetAddressBytes(), 0);

    if (SendARP(uintAddress, 0, macAddr, ref macAddrLen) == 0)
    {
        Console.WriteLine("{0} responded to ping", dst.ToString());
    }
}

但是如您所见,ARP请求所有该范围将花费很长时间。在我的笔记本电脑上等待10至15分钟。当然,在大多数情况下,您可以更快地找到所需的IP,这并不是说您不是很不幸PC会落在192.168.255.255左右,但这仍然需要几分钟。这只会执行一次,因为大多数时间PC和笔记本电脑都使用首选IP,除非更改,否则这些IP将保留数天或数月,因此只要它继续使用该IP,就不需要进行另一次ARP提取。 。到目前为止,最好的选择是第一次进行这种“热启动”,并用加载屏幕来装饰它,但是我想知道是否有更快的方法来实现这一目标。另外,我只是在寻找Windows PC,因为它位于同一应用程序的实例之间。

1 个答案:

答案 0 :(得分:5)

ICMP和ARP用于定位设备,而不是服务。这就是UDP广播的目的。

在所选的某些端口上使用UdpClient向程序添加UDP侦听器。要在子网中查找程序的实例,请将数据包发送到broadcast地址。子网中的所有计算机都将获取该数据包,任何正在运行程序的计算机都将向数据源返回一个数据包,其中包含您需要了解的所有信息。它可以是简单的查询/确认类型交换,也可以是一组丰富的信息。

这样做的好处是,您发送了一个数据包,得到了一些响应,整个过程在几毫秒内就结束了……并且/ 16网络上的速度与/ 24网络上的速度相同。 ..或/ 8。

查看this post,获取有关如何进行UDP广播的简单代码示例。