Возможна ли трансляция через TCP? - PullRequest
15 голосов
/ 28 ноября 2010

Я пишу сервер / клиентскую систему на C, которая использует BSD Sockets под TCP-соединением.Сервер является многопоточным, каждое соединение работает со своим собственным рецептором.Каждый клиент хорошо работает, общаясь с сервером один на один, к сожалению, я не могу придумать, как реализовать функцию SendToAll (), например, если клиент A делает что-то, что требует отправки пакетавсе клиенты.Как бы я это сделал?

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

Но да, есть ли способ вещать через TCP, как вы можете через UDP?1005 *

Ответы [ 4 ]

11 голосов
/ 28 ноября 2010

Как все говорили, это невозможно с TCP, это только одноадресная передача. Однако существуют реализации надежной многоадресной рассылки, которая должна обеспечивать многоадресную рассылку с надежностью TCP. См. Википедия , особенно Прагматическая общая многоадресная рассылка .

7 голосов
/ 28 ноября 2010

Нет, нет.Например, концепция размера окна и того, как он настраивается, становится совершенно бессмысленной, если вы пытаетесь общаться с несколькими сторонами.

Возможно, будет возможно создать новый протокол, который разделяет многие атрибуты TCP, в то время какразрешить многоадресную рассылкуНо я думаю, что это было бы очень проблематично.Например, скорость, с которой получатели получали данные, будет ограничена ограничениями самого медленного получателя.Отправитель должен управлять буферным пространством, чтобы даже самый медленный получатель мог получать повторные передачи в случае необходимости.

Нет, я думаю, что протоколы для многоадресной передачи всегда должны быть очень специальными и ориентированы на точноепроблема под рукой.Что-то обобщенное и подобное TCP просто неосуществимо.

Существуют способы надежной групповой передачи данных.Основная идея заключается в использовании кодов стирания для непрерывной передачи информации в виде петли.Затем получатель может просто начать получать пакеты, пока у них не будет достаточно для восстановления исходного файла.

Но, похоже, они не вписываются в ваш сценарий.

2 голосов
/ 28 ноября 2010

Рассмотрите возможность просмотра оверлейных сетей или просто используйте промежуточное программное обеспечение для обмена сообщениями, которое предоставляет семантику публикации, такую ​​как ØMQ , которая также удобно предоставляет API сокетов BSD.

1 голос
/ 28 ноября 2010

Ваш SendToAll() должен будет перебрать все открытые сокеты и записать данные в каждый независимо.

Широковещательная и многоадресная рассылка ограничены только сокетами UDP.

...