Как транслировать видео с использованием класса UDPCLient в C # через Интернет? - PullRequest
1 голос
/ 18 марта 2012

Я пытаюсь разработать Video Client / функциональность, которая захватывает видео с помощью веб-камеры и передает его другому servent (сервер-клиент) где-нибудь в Интернете. Для этого я использую класс UDPCLient.

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

Но когда я тестирую приложение из-за маршрутизатора (через две разные сети / Интернет) после переадресации соответствующих портов, подключение к Интернету теряется на обоих маршрутизаторах (они зависают или что-то в этом роде), и мне нужно перезапустить маршрутизаторы или переключиться на альтернативное соединение. Конфигурация выглядит следующим образом:

Servent 1 <-> Router1 <-> Интернет-соединение # 01

Servent 02 <---> Router2 <---> Интернет-соединение # 02

Оба соединения находятся на отдельной линии DSL. Один из маршрутизаторов - бренд ZTE, а другой - Netgear.

Код для прослушивания / передачи выглядит следующим образом:

private void StartSockets()
    {
        //For testing across internet i use IPAddress obtained via different function
        var IPAddress = getMyIpAddress();
        this.udpSender = new UdpClient(IpAddress, 4000);
        this.udpListener = new UdpClient(4000);
    }
private IPAddress getMyIpAddress()
        {
            IPAddress localIP ;//= AddressAr[0];
            localIP = IPAddress.Parse(GetPublicIP());
            return localIP;
        }
public string GetPublicIP()
        {
            String direction = "";
            WebRequest request = WebRequest.Create("http://checkip.dyndns.org/");
            using (WebResponse response = request.GetResponse())
            {
                using (StreamReader stream = new StreamReader(response.GetResponseStream()))
                {
                    direction = stream.ReadToEnd();
                }
            }

            //Search for the ip in the html
            int first = direction.IndexOf("Address: ") + 9;
            int last = direction.LastIndexOf("</body>");
            direction = direction.Substring(first, last - first);

            return direction;
        }

Код для получения ответа выглядит следующим образом:

private void ReceiveData()
        {
            //For testing across internet i use IPAddress obtained via different function
            var IPAddress = getMyIpAddress();

            IPEndPoint ep = new IPEndPoint(IPAddress, myPort);
         try
                {
                    byte[] receiveBytes = this.udpListener.Receive(ref ep);
                    this.OnReadImage(new ImageEventArgs(this.ByteToImage(receiveBytes)));
                }
                catch (Exception)
                {

                }

        }

Если я тестирую в локальной сети, я использую DNSHostname, чтобы получить IP-адрес (частные IP-адреса), и видео отлично работает в локальной сети. Это не работает через Интернет, поэтому я переключаюсь на действующий IP-адрес и, таким образом, я использую метод getPublicIpAddress ().

  1. Я знаю, что с моим подходом что-то серьезно не так? Какой будет правильный подход?
  2. Должен ли я переключиться на приемник TCP? Я намерен иметь несколько приемников одного и того же видео в будущем. Так это повлияет?
  3. Могут ли клиенты UDP вызвать сбой, зависание и перезапуск маршрутизаторов? Как я могу избежать этого?

  4. И, наконец, если бы не было переадресации портов, какой была бы лучшая стратегия?

Пожалуйста, помогите.

Спасибо

Steve

...