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

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

Похожие вопросы