VariusRain
@VariusRain
музыкант-программист-конструктор

В чём моя фундаментальная ошибка в понимании UDP и TCP?

Всем доброго времени суток!
В тегах стоит си шарп, потому что я на нём работаю, и примеры кода, если они будут нужны, будут на нём же, но вот в чём моя проблема.

Я писал множество программ, которые работают по сети. Это всегда был TCP. Я его понял, я с ним живу и всё с ним хорошо.
Придумал я себе новую задачу, и решил для неё использовать UDP, так как из имеющихся у меня данных это должно быть удобнее.

Суть следующая. Есть сервер. Он принимает подключения как по TCP так и по UDP. В какой-то момент времени на одном из подключенных клиентов что-то происходит и он оповещает об этом сервер по TCP. Задача сервера же - оповестить об этом всех клиентов уже по UDP, используя Broadcast рассылку. Примерная схема взаимодействия ниже.
5f71f71912af6373560744.png
Задумка была у меня такой, что в тот момент времени, когда от клиента прилетает сообщение по TCP, сервер смотрит, что же такого ему прислали и если это достойно дальнейшей рассылки просто делается переотправка этого сообщения дальше:
public void Send(byte[] data) {
	IPEndPoint targetEndPoint = new IPEndPoint( IPAddress.Broadcast, 27000 );
	socket.SendTo( data , targetEndPoint );
}

в этот момент времени все клиенты получают это добро через
byte[] data = udpClient.Receive( ref ip );
И дальше уже думают как им с этим жить.

Я написал клиент и сервер на tcp соединении, протестировал, всё работает, все счастливы.
Дописал в клиент подключение к серверу по UDP
Добавил на стороне сервера эту саму рассылку и вся эта схема не работает...
Думаю: ну значит я просто куда-то не туда свернул или что-то как-то не так написал, полез в документацию.
Читаю:
UDP — это простой протокол для максимально эффективной передачи данных в удаленный узел. Однако поскольку протокол UDP не предусматривает установление соединений, доставка датаграмм UDP, отправляемых в удаленную конечную точку, не гарантируется.

И тут у меня всё сломалось. Получается, что я вообще неправильно понимал ситуацию всё это время и по UDP соединение как таковое не устанавливается?
Оно работает просто по принципу: кину что-нибудь в сеть, авось долетит...
Я зацепился за UDP из-за возможности широковещательной отправки сообщений, так как мне не нужна была обязательная доставка. Не долетит и ладно.
А получается, что, если UDP не поддерживает подключение как таковое, то моя идея в корне провальна? И мне проще при получении сообщения сервером, просто пройтись по циклу всех клиентов и разослать его всем?
  • Вопрос задан
  • 355 просмотров
Решения вопроса 1
@Wexter
Ну начнём с того что широковещательный UDP работает вообще в пределах одного сегмента L2 сети, т.е. всем хостам в той-же сети что и сам сервер. Куда-либо за пределы этой сети пакеты не пойдут
А так да, UDP не гарантирует доставку пакета. Хотите гарантированную - используйте TCP и делайте сами "широковещательную" рассылку. Не вижу никаких проблем использовать его для этого
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
26 окт. 2020, в 01:56
3500 руб./за проект
25 окт. 2020, в 23:21
5000 руб./за проект
25 окт. 2020, в 21:47
1500 руб./за проект