Как получить IP-адреса всех устройств в локальной сети с помощью Unity UNET на С#?

все!

У меня много устройств в одной локальной сети. Как я могу получить IP-адреса всех этих устройств?

Я хочу сделать что-то вроде этого:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Tools : MonoBehaviour {

    //get local ip address
    public string getIP() {

        string IP = "";

        IP = Network.player.ipAddress;

        return IP;
    }

    //get all ip addresses in local network
    public List<string> getIPArray() {

        List<string> listIP = new List<string>();


        return listIP;
    }
}

person IlyaGutnikov    schedule 21.06.2016    source источник
comment
Какие типы устройств и почему вы хотите это сделать? Это для сетевой игры? Например, чтобы подключиться к этим устройствам с их IP для мультиплеера?   -  person Programmer    schedule 21.06.2016
comment
@Programmer Я хочу создать многопользовательскую игру на основе сообщений UNet. Я хочу создать лобби, где клиенты могут подключаться к серверам без жестко заданного IP-адреса серверов. Я представляю это как опрос всех IP в локальной сети и получение информации о том, какой из них сервер. Извините за английский и объяснения.   -  person IlyaGutnikov    schedule 21.06.2016
comment
Я не понимаю вопрос/проблему/цель вопроса. Если у вас есть устройства в сети, вы не можете просто запросить IP. Вам нужен сервер для подключения клиентов и управления всем игровым процессом. Я рекомендую вам прочитать онлайн-учебники и документацию по Unity.   -  person Cabrra    schedule 21.06.2016
comment
@IlyaGutnikov Я понимаю, что ты делаешь. Посмотрите на мой ответ.   -  person Programmer    schedule 21.06.2016
comment
@Cabrra Мне нужно что-то вроде этого: stackoverflow.com/a/19945759/3884619   -  person IlyaGutnikov    schedule 21.06.2016


Ответы (1)


Есть два способа сделать это:

1.UDP

Это долгий процесс, но его можно выполнить с помощью UDP.

1. Первое, что нужно сделать, это получить свой локальный IP-адрес. Если ваш локальный IP-адрес 192.168.1.13, вы должны удалить последний октет, равный 13, и заменить его на 255.

2. Запустите сервер UDP во всех играх и слушайте IPAddress.Any через любой порт, который вы хотите. Рекомендуется использовать порт >=9000. Указанные ниже порты обычно используются некоторыми другими приложениями. Если что-то получено от клиента, отправьте что-нибудь обратно клиенту, чтобы клиент знал, что вы доступны.

3. Чтобы найти игру, создайте UDP-клиент и отправьте что-нибудь на этот IP-адрес из #1, который заканчивается на 255, затем прослушайте, чтобы прослушать IPAddress.Any, чтобы увидеть, есть ли является ответом. Если ответ/сообщение получено с любого сервера, сохраните IP-адрес, с которого получено сообщение, в массив или List.

4. Затем вы можете использовать этот сохраненный IP-адрес из #3, чтобы найти все доступные устройства в вашей сети.

Вот рабочий пример.

Плохая сторона в том, что это не будет работать, если у вас есть бесплатная версия Unity. Существует ограничение, требующее наличия Unity Pro для использования любого необработанного API сокетов из C#. Больше не действует в Unity 5 и выше. Теперь это можно использовать в Unity 5 и выше без профессиональной лицензии.


2.NetworkDiscovery

Хорошая новость заключается в том, что Unity упростила вам задачу в версии 5.3 или около того. Я не могу вспомнить, какая версия, но убедитесь, что у вас последняя версия. Вам не нужно использовать Unity Pro, чтобы это работало.

Вы можете использовать класс NetworkDiscovery для выполнения это в новой версии Unity. Просто вызовите NetworkDiscovery.StartAsServer() для передачи сообщений клиентам. На стороне клиента вы можете прослушать трансляцию, вызвав NetworkDiscovery.StartAsClient(). Вы можете использовать OnReceivedBroadcast(string fromAddress, string data);, чтобы увидеть, с какого устройства вы получили. Это не может быть проще, чем это.

person Programmer    schedule 21.06.2016
comment
@ИльяГутников Нп. Вы также можете транслировать на 255.255.255.255. Я не упомянул об этом, потому что иногда ОС блокирует это. 192.octet.octet.25 надежнее. Удачи. - person Programmer; 21.06.2016