Каков лучший способ для клиентского приложения для нахождения сервера в локальной сети в C#?

Используйте это:

DropdownButton<String> button = DropdownButton(
  items: items.entries
      .map<DropdownMenuItem<String>>(
          (MapEntry<String, String> e) => DropdownMenuItem<String>(
                value: e.key,
                child: Text(e.value),
              ))
      .toList(),
  onChanged: (String newKey) {/* todo handle change */},
);
12
задан phihag 20 February 2009 в 02:14
поделиться

3 ответа

Рассмотрите широковещательную передачу определенного пакета UDP. Когда сервер или серверы видят широковещательно переданный пакет UDP, они отправляют ответ. Клиент может собрать ответы из всех серверов и начать соединяться с ними или на основе алгоритма выборов.

Посмотрите пример для клиента (непротестированный код):


using System.Net;
using System.Net.Sockets;

[STAThread]
static void Main(string[] args)
{
    Socket socket = new Socket(AddressFamily.InterNetwork,
    SocketType.Dgram, ProtocolType.Udp);
    socket.Bind(new IPEndPoint(IPAddress.Any, 8002));
    socket.Connect(new IPEndPoint(IPAddress.Broadcast, 8001));
    socket.Send(System.Text.ASCIIEncoding.ASCII.GetBytes("hello"));

    int availableBytes = socket.Available;
    if (availableBytes > 0)
    {
        byte[] buffer = new byte[availableBytes];
        socket.Receive(buffer, 0, availableBytes, SocketFlags.None);
        // buffer has the information on how to connect to the server
    }
}
11
ответ дан 2 December 2019 в 05:56
поделиться

Я сказал бы, что лучший способ состоит в том, чтобы использовать Bonjour/Zeroconf/mDNS для C#; длительное размышление вошло в то, чтобы заставлять это играть по правилам с сетью; IE это проверяет с помощью ping-запросов менее часто со временем, если это возможно, и т.д. Там Моно. Zeroconf, и я читал существует более старый проект.NET в SDK Apple, но я не нашел его.

Таким образом, самое легкое должно было бы установить Добрый день для Windows, затем получить Windows Binaries для Моно. Zeroconf пробуют пример MZClient.exe отбросьте Mono.Zeroconf.dll и/или Mono.Zeroconf.Providers.Bonjour.dll в Ваши ссылки проекта и идут.

Что-то вроде этого:

var service = new Mono.Zeroconf.RegisterService {
                Name = "Use Me for Stuff",
                RegType = "_daap._tcp",
                ReplyDomain = "local.",
                Port = 0024200,
                TxtRecord = new Mono.Zeroconf.TxtRecord {
                            {"I have no idea what's going on", "true"}}
              };
service.Register();

var browser = new Mono.Zeroconf.ServiceBrowser();
browser.ServiceAdded +=
    delegate(object o, Mono.Zeroconf.ServiceBrowseEventArgs args) {
        Console.WriteLine("Found Service: {0}", args.Service.Name);
        args.Service.Resolved +=
            delegate(object o, Mono.Zeroconf.ServiceBrowseEventArgs args) {
                var s = args.Service;
                Console.WriteLine(
                    "Resolved Service: {0} - {1}:{2} ({3} TXT record entries)",
                    s.FullName, s.HostEntry.AddressList[0], s.Port, s.TxtRecord.Count);
          };
        args.Service.Resolve();
    };
browser.Browse("_daap._tcp", "local");
9
ответ дан 2 December 2019 в 05:56
поделиться

Имейте сервер, прислушиваются к широковещательной передаче на определенном порте в сети (должен использовать UDP), Когда клиент запускает, имеют его, широковещательно передал некоторый запрос "ping" на том порте. когда сервер видит "ping", он передает сообщение обратно с адресом TCP и портом, необходимым, чтобы клиент соединился с ним.

1
ответ дан 2 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: