Возможно ли трансляция через TCP?

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

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

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

Ответы

Ответ 1

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

Ответ 2

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

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

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

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

Но они, похоже, не подходят для вашего сценария так хорошо.

Ответ 3

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

Ответ 4

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

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