Разница между методом UdpClient.Send и методом UdpClient.Client.Send - PullRequest
0 голосов
/ 06 сентября 2011

Я могу отправлять данные по протоколу udp с помощью метода UdpClient.Send (байтовый массив) или UdpClient.Client.Send (stream). оба метода работают. единственные различия состоят в том, что в одном методе я передаю байтовый массив, а в другом - поток.

быстрый пример:

UdpClient udpClient = new UdpClient(localEndPoint);
// I can eather send data as:
udpClient.Send(new byte[] { 0, 1, 2 }, 3);
udpClient.Client.Send(new byte[5]);

Кроме того, какой метод будет гарантировать, что мои данные достигнут пункта назначения без потери информации? Я читал, что протокол udp не гарантирует, что все байты достигают своего места назначения, поэтому лучше для потоковой передачи видео, аудио, но не для передачи файлов, как я делаю. Причина, по которой я использую udp вместо tcp, заключается в том, что очень сложно установить соединение tcp между двумя пользователями, которые находятся за маршрутизатором. Я знаю, что это будет возможно, если один из пользователей включит переадресацию портов на своем маршрутизаторе. Мне удалось отправить данные, выполнив то, что называется udp punch holing. UDP Punch Holing позволяет установить соединение между двумя пользователями, которые находятся за маршрутизатором с помощью сервера. Будет долго объяснять, как это работает здесь, вы можете найти много информации, если вы Google. В любом случае, я просто хотел сообщить вам, почему я использовал udp вместо tcp. Не знаю, можно ли будет отправить файл с этим протоколом, чтобы убедиться, что данные не потеряны. возможно я должен создать алгоритм. или, возможно, метод UdpClient.Client.Send гарантирует получение данных, а метод UdpClient.Send не гарантирует получение данных.

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

UDP не гарантирует доставку данных или их порядок. Это только гарантирует, что если вы получите пакет успешно, пакет завершен. Вы должны сделать вашу сетевую связь надежной с вашей собственной реализацией. Две функции не должны иметь никакого значения.

Сетевое программирование в UNIX имеет главу для этой темы. (22.5 Добавление надежности в приложение UDP). Вы также можете взглянуть на libginble , который поддерживает функцию обхода NAT (с STUN или реле) и надежность связи.

Эта статья, Надежность и управление потоком , также может помочь вам понять один из возможных способов ее реализации. Удачи!

1 голос
/ 06 сентября 2011

Нет никакой разницы между этими двумя методами, UdpClient является оберткой вокруг Socket.UdpClient.Client просто дает вам прямой доступ к сокету, который использует UdpClient.Они оба в конечном итоге отправляют данные через сокет.

Ни один из них не гарантирует, что все данные будут получены.UDP не гарантирует, что 1. данные будут доставлены и 2. если они будут доставлены, они будут доставлены в порядке.Если вам нужны оба из них (и вы не можете использовать TCP), вам придется написать этот код самостоятельно.

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

Ваш порядковый номер может быть текущей позицией размера файла в байтах - вот чтоTCP использует.

Я бы порекомендовал прочитать протокол TCP, чтобы вы понимали механизмы, которые он использует для обеспечения надежности (помните, что TCP и UDP основаны на IP - TCP просто более устойчив (и coplex)протокол, чтобы вы могли реализовать его части самостоятельно)

...