Я пытаюсь разработать 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 ().
- Я знаю, что с моим подходом что-то серьезно не так? Какой будет правильный подход?
- Должен ли я переключиться на приемник TCP? Я намерен иметь несколько приемников одного и того же видео в будущем. Так это повлияет?
Могут ли клиенты UDP вызвать сбой, зависание и перезапуск маршрутизаторов? Как я могу избежать этого?
И, наконец, если бы не было переадресации портов, какой была бы лучшая стратегия?
Пожалуйста, помогите.
Спасибо
Steve