检测连接到局域网的主机

时间:2009-03-23 04:56:02

标签: c# detection autodiscovery

为了在c#中创建一个lan messenger,我需要使用相同的lan messenger软件在线检测主机。 我试着寻找一个起点,但是徒劳无功。 我需要知道如何开始工作。

7 个答案:

答案 0 :(得分:2)

我过去通过两种方式完成此任务:让所有客户端连接到预定义的主机(简单,但需要一些客户端配置)并让主机(或客户端)通过“广播”广播它们的存在地址(例如,10.0.255.255)(硬,防火墙/ NAT可能会让生活变得痛苦,客户端不需要配置)。

但是,是的 - 如果WCF实现了发现协议,请继续使用。只要它做你想做的事情,它可能比你(或大多数人)可以写的任何东西都好。

答案 1 :(得分:1)

您可以使用Windows Connection Foundation吗?如果是这样,您可以使用WCF来实现WS-Discovery协议。这是一个brief howto

答案 2 :(得分:1)

根据您是否计划依赖中央服务器,您可以选择:

1)没有服务器:当客户上线时,他会广播其身份,要求其他客户发送他们的身份。

2)集中服务器:新客户端连接,他注册到服务器并下载客户端列表。然后,通过新客户端通知每个客户端(通过轮询,双工合同,如果使用WCF,或通过基本套接字连接)。

第一个版本将基于UDP套接字。请注意,这不适用于本地网络,因为我相信这些数据包不会通过路由器。它也可能是一个糟糕的设计,因为大量的客户端只会用数据包淹没网络。但是,嘿,这对你来说可能就足够了。

WCF也有点对点支持,对您来说可能很有意思。 Here是关于它的文章。

答案 3 :(得分:1)

您可能喜欢使用ZeroConf,也就是使用Bonjour,Rendevous或Avahi。

http://www.mono-project.com/Mono.Zeroconf

http://craz.net/programs/ZeroconfNetServices/

答案 4 :(得分:1)

使用我在LAN Messenger中使用的GetComputers()方法

using System.Diagnostics;

public static string[] GetComputers()
{
    //Process that retrieves the net view >> list of computers on the network
    Process proc = new Process();
    proc.StartInfo.FileName = "net.exe";
    proc.StartInfo.CreateNoWindow = true;
    proc.StartInfo.Arguments = "view";
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.UseShellExecute = false;
    proc.Start();

    //Reads the output of the net view.
    StreamReader sr = new StreamReader(proc.StandardOutput.BaseStream);
    string line = "";

    List<string> names = new List<string>();
    while ((line = sr.ReadLine()) != null)
    {
        if (line.StartsWith(@"\\"))
            names.Add(line.Substring(2).Split(' ')[0].TrimEnd());
    }

    sr.Close();
    proc.WaitForExit();

    //Array that contains computer names
    string[] computerNames = new string[names.Capacity];
    int i = 1;

    //Adds computers names to the list view
    foreach (string name in names)
    {
        computerNames[i] = name;
        i++;
    }

    return computerNames;
}

答案 5 :(得分:0)

您可以让您的应用程序侦听预定义的端口,当有人连接到该端口时,会发回某种类型的确认,例如应用程序名称和IP。

因此,当新客户端上线时,它会向广播发送一个广告其IP的UDP数据包。其他客户端会在相关端口上侦听这些“公告”,并将其自己的IP(通过其他端口)发送回发送方。因此,现在LAN上所有正在运行的客户端将使用其IP来联系初始发件人。其他客户也可以记录“公告”发件人的IP - 这将让他们保持网络上其他客户的最新列表。

为了使列表保持最新状态,您可以让所有客户端以半随机间隔(例如每分钟+兰特(10)秒)在网络上广播它们的存在。

以上所有假设您都在谈论同一网络上的客户。如果您在互联网上这样做,您将需要一些中心点来跟踪登录客户端的ips。

答案 6 :(得分:0)

我认为可以ping广播ip并从每个人那里得到答案。或类似的东西。可以从那开始,然后检查客户端是否正在侦听某个端口或其他东西。

替代方案是让客户告诉服务器“我们还在这里!”每隔一段时间。