3

为了在 c# 中创建局域网信使,我需要使用相同的局域网信使软件明显地在线检测主机。我试图寻找这样做的起点,但徒劳无功。我需要知道如何开始工作。

4

7 回答 7

2

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

但是,是的——如果 WCF 实现了一个发现协议,那就去吧。如果它做你想做的事,它可能比你(或大多数人,就此而言)可以写的任何东西都要好。

于 2009-03-23T05:18:52.527 回答
1

您可以使用 Windows 连接基础吗?如果是这样,您可以使用 WCF 来实现 WS-Discovery 协议。这是一个简短的操作方法。

于 2009-03-23T05:02:23.547 回答
1

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

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

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

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

WCF 还提供点对点支持,您可能会感兴趣。是一篇关于它的文章。

于 2009-03-23T05:20:12.070 回答
1

您可能喜欢使用 ZeroConf aka Bonjour、Rendevous 或有时是 Avahi。

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

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

于 2009-03-23T05:31:44.477 回答
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;
}
于 2012-09-04T11:42:16.423 回答
0

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

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

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

以上所有内容都假设您正在谈论同一网络上的客户端。如果您在 Internet 上执行此操作,则需要一些中心点来跟踪已登录客户端的 ips。

于 2009-03-23T05:17:51.890 回答
0

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

另一种方法是让客户端告诉服务器“我们还在这里!” 每隔一段时间。

于 2009-03-23T05:20:13.897 回答