Проблема с Unity UNET при воспроизведении через точку доступа Wi-Fi

Я разрабатываю многопользовательскую игру по локальной сети с использованием UNET.

Я использовал многоадресную рассылку UDP для передачи IP-адреса сервера, и другие устройства могут его прослушивать.

У меня есть расширенный сетевой менеджер для некоторых необходимых настроек пользовательского интерфейса.

Устройство, которое делает сервер, может транслировать свой IP-адрес, а другое устройство автоматически получает IP-адрес сервера (это также может быть имя игры) в списке.

При выборе сервера клиент может присоединиться к игре. Я избежал ситуации, когда пользователь вводит ip.

Я счастлив, потому что это работает успешно, когда все игроки играют через маршрутизатор.

Худшая часть начинается, когда я делаю любое устройство точкой доступа Wi-Fi, и к нему присоединяется другое устройство.

Даже создание сервера не удается.

Я также могу поделиться своим кодом, если кто-то собирается мне помочь.

Это проблема с UNET?

Нужно ли использовать какое-то конкретное решение?

В точке доступа Wi-Fi мы должны использовать другие порты, чем обычный маршрутизатор?

Я могу приложить свой код, если кто-то сталкивался с подобным.

Если это так, то как работает сетевой менеджер по умолчанию, предоставляемый единством? Он работает, если мы вводим ip .

Я добавил несколько дополнительных скриптов. Пользователю sao не нужно писать ip и слушать сообщение сервера.

Я думаю, что мой код ломается из-за многоадресной рассылки udp или проблемы с портом.

Прикрепляю свой код.

Код сервера:

using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.Networking.NetworkSystem;
using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Net;
using System.Text;
using UnityEngine.UI;
using UnityEngine.Networking; // added for test

public class ServerDemoSample : MonoBehaviour 
{
    public static ServerDemoSample instance;

    //public byte[] buffer;
    UdpClient serverOriginator;
    public string serverIP;
    public int broadcastPort = 8080; //THIS IS ORIGINAL
    //int broadcastPort = 7777;
    public IPAddress groupIP = IPAddress.Parse ("239.0.0.222");
    //public IPAddress groupIP = IPAddress.Parse ("224.0.1.0");

    public IPEndPoint remoteEP;

    public Text myIpText;
    public bool isRunning;

    public Button startGameButton;
    public Button creatServerButton;
    public bool iAmServer = false;

    void Start () 
    {
        //DontDestroyOnLoad (gameObject);
        myIpText.text = Network.player.ipAddress;
    }

    void Update()
    {
    }

    public void BroadcastServerIP() 
    {
        Debug.Log(Time.realtimeSinceStartup + ": Broadcasting IP:" + serverIP);
        byte[] buffer = ASCIIEncoding.ASCII.GetBytes(serverIP);
        serverOriginator.Send(buffer, buffer.Length, remoteEP);
        GLOBALS.instance.serverIpAddress = serverIP;
        isRunning = true;
    }

    public void StartServer()
    {
        serverIP = Network.player.ipAddress;
        iAmServer = true;
        GLOBALS.instance.iAmGlobalServer = true;
        //Create UDP Client for broadcasting the server
        serverOriginator = new UdpClient();

        serverOriginator.JoinMulticastGroup(groupIP);

        remoteEP = new IPEndPoint(groupIP, broadcastPort);
        GLOBALS.instance.serverIpAddress = serverIP;
        creatServerButton.transform.FindChild("Text").GetComponent<Text>().text = "Server Created!";
        //Broadcast IP
        InvokeRepeating("BroadcastServerIP", 0, 1f);
        print ("Server IP (SERVER_SCRIPT) :  " + serverIP);
    }
}

Код клиента:

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
using UnityEngine.Networking.NetworkSystem;
using System;
using System.Net;
using System.Text;
using System.Net.Sockets;
using System.Collections;
using System.Collections.Generic;

public class ClientDemoScript : MonoBehaviour 
{
    public static ClientDemoScript instance;
    UdpClient client;
    int receivePort = 8080; //THIS IS ORIGINAL
    public string serverIP_;
    IPAddress groupIP_ = IPAddress.Parse("239.0.0.222");
    public string ipFound;
    byte[] receivedBytes = {0,0,0,0}; // made private for all 

    IPEndPoint remoteEP_;
    public Text serverIp2Text;
    public string results;
    public Text displayServerList;

    public List<string> receivedIpList = new List<string>();

    void Start () 
    {
        instance = this;
        JoinServer();
    }

    void Update()
    {
        serverIp2Text.text = results;
    }

    public void ReceiveServerInfo(IAsyncResult result) 
    {   
        Debug.Log("Received Server Info");

        remoteEP_ = new IPEndPoint(IPAddress.Any, receivePort);

        if (client != null) 
        {
            if (result != null) 
            {
                receivedBytes = client.EndReceive (result, ref remoteEP_);
            } 
            else 
            {
                return;
            }
        }

        ipFound = Encoding.ASCII.GetString (receivedBytes); //made public var

        if (!receivedIpList.Contains (ipFound)) 
        {
            receivedIpList.Add (ipFound);
        }



        Debug.Log("ip: "+ ipFound);

        client.BeginReceive (new AsyncCallback (ReceiveServerInfo), null);
        GLOBALS.instance.serverIpAddress = ipFound;
    }

    public void JoinServer()
    {
        if (client == null) 
        {
            client = new UdpClient(receivePort);
            client.JoinMulticastGroup(groupIP_);
        }

        client.BeginReceive (new AsyncCallback (ReceiveServerInfo), null);
    }

}

person mayur bhagat    schedule 25.05.2016    source источник
comment
Очень вероятно, что устройство точки доступа Wi-Fi отключило UPnP или вообще не поддерживает его. Вы можете проверить, поддерживается ли или включен UPnP, перейдя в настройки. Обычно это 192.168.1.1, но каждая точка доступа Wi-Fi отличается, поэтому у вас она может отличаться.   -  person Programmer    schedule 25.05.2016
comment
Я редактирую свой вопрос. Если это так, как сетевой менеджер по умолчанию работает в единстве. Я предполагаю, что какая-то проблема с кодом, который я использовал. Функции кода: Многоадресная рассылка UDP для совместного использования IP-адреса сервера. Процедура Для сервера: создайте КОНЕЧНУЮ ТОЧКУ IP и начните вещание на определенном ПОРТ и IP. Для клиента: создайте КОНЕЧНУЮ ТОЧКУ IP и начните слушать определенный ПОРТ и IP.   -  person mayur bhagat    schedule 25.05.2016
comment
Я думаю, что проблема присутствует только для устройства, которое действует как сервер точки доступа Wi-Fi. Таким образом, устройство не может общаться с другими. Вот аналогичный вопрос для родного андроида. stackoverflow.com/questions/14080573/ Теперь вопрос в том, как решить эту проблему в единстве.   -  person mayur bhagat    schedule 25.05.2016
comment
Только что посмотрел ваш код. Пожалуйста, измените порт 8080 на другой как на сервере, так и на клиенте. Порт 8080 используется для HTTP-сервера, а не для этого. Вы не можете выбрать порт случайным образом. Вы должны убедиться, что выбранный порт не является зарезервированным портом. Вы можете использовать что-то вроде 7732.   -  person Programmer    schedule 25.05.2016
comment
Кроме того, вы сказали, что это работает, но не работает, когда вы делаете любое устройство точкой доступа Wi-Fi ... Что это значит? Как сделать устройство точкой доступа Wi-Fi? В первый раз, когда я прочитал это, я подумал, что вы сказали, что это не работает, когда вы используете точку доступа Wi-Fi, но я думаю, что сейчас я неправильно понял это. В любом случае, меня сейчас не будет, и я отвечу вам через 5 часов. Пока меня нет, пожалуйста, используйте это время, чтобы описать, что вы имеете в виду, когда делаете устройство точкой доступа. Шаги, которые вы выполнили для этого, и то, как каждое устройство подключается друг к другу в сети...   -  person Programmer    schedule 25.05.2016
comment
Порт 8080 был последней попыткой. Я использовал 7778 7777 и в аналогичном диапазоне, но не повезло ›. Точка доступа Wi-Fi означает активную точку доступа (модем) на одном мобильном устройстве. Другой мобильный телефон подключается к этому мобильному телефону вместо маршрутизатора. вот красивая игра, которая делает это правильно. Эта функция полезна, когда собираются друзья, а поблизости нет маршрутизатора. Любое одно устройство может включить модем, а другое присоединится к нему. Они создают локальную группу, используя это средство.   -  person mayur bhagat    schedule 26.05.2016