为了在c#中创建一个lan messenger,我需要使用相同的lan messenger软件在线检测主机。 我试着寻找一个起点,但是徒劳无功。 我需要知道如何开始工作。
答案 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。
答案 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并从每个人那里得到答案。或类似的东西。可以从那开始,然后检查客户端是否正在侦听某个端口或其他东西。
替代方案是让客户告诉服务器“我们还在这里!”每隔一段时间。