Широковещательная передача как UDP с надежностью TCP

Я думаю, что вы перепутали свои отступы кода после их копирования. Например, display_receipt (), кажется, не имеет тела, как сейчас. Пожалуйста исправьте. Кроме того, строка «if menu == 1:» кажется неуместной.

Предположим, ваш отступ хорош. Ошибка, показанная выше, связана с тем, что totalp был назначен вне области действия функции, на которую он ссылается. Так что используйте (и, если вам нужно, прочитайте о) ключевое слово «global». По сути, если вы измените свою функцию choose_menu () так, чтобы она была похожа на

def choose_menu():
    global totalp
    print("")
    # code continues as shown above

, вы получите желаемое поведение. Вам, вероятно, придется сделать то же самое для TotalT.

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

20
задан Jeffrey 28 August 2008 в 02:55
поделиться

15 ответов

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

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

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

, Если Вы хотите что-то больше, большинство библиотек пользовательского протокола находится в C++, таким образом, я не уверен, каким количеством использования они будут Вам. Однако моему знанию здесь несколько лет - возможно, некоторые протоколы были портированы к настоящему времени. Хм... RakNet и enet являются двумя библиотеками C/C++, которые приходят на ум.

15
ответ дан 29 November 2019 в 23:48
поделиться

Вы могли использовать Распространение , чтобы сделать коммуникацию группы.

7
ответ дан 29 November 2019 в 23:48
поделиться

Смотрите на sctp, который имеет комбинацию tcp и udp функций. Существует окна реализация доступный.

10
ответ дан 29 November 2019 в 23:48
поделиться

Вы могли реализовать свое собственное подобное TCP поведение на прикладном уровне.

Так, например, Вы отослали бы широковещательную передачу UDP, но затем ожидали бы ответ ответа от каждого хоста. Если Вы не получили ответ в течение X секунд, то отправьте другого и так далее до достижения своего рода порога. Если порог достигнут (т.е. хост не ответил вообще), то сообщите об ошибке.

, Чтобы сделать это, хотя, Вам был бы нужен предопределенный список хостов для ожидания ответов назад из.

1
ответ дан 29 November 2019 в 23:48
поделиться

сделайте RDP многоадресно передал.

-3
ответ дан 29 November 2019 в 23:48
поделиться

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

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

0
ответ дан 29 November 2019 в 23:48
поделиться

Почему сборка что-то с нуля, если можно пользоваться библиотекой? Специально для такого маленького проекта?

использование Попытки Emcaster, который сам с помощью надежного многоадресного обмена сообщениями - PGM, записан в.NET и с полным источником. Вы получите хороший pub/sub механизм с темой, фильтрующей легко доступный. Или можно узнать из кода, как сделать это и основывать собственное расширение на нем.

0
ответ дан 29 November 2019 в 23:48
поделиться

То, что можно сделать, - то, что после широковещательной передачи имеют эти , клиенты инициируют соединения TCP. Иначе просто необходимо сохранить список всех клиентов и инициировать соединения с каждым клиентом сами.

0
ответ дан 29 November 2019 в 23:48
поделиться

Я думаю, что существует три опции, вообще говоря:

  1. Вместо широковещательного UDP, Вы могли создать объект (поток, процесс, сервер, сервис, или независимо от того, что вещь, это существует в Вашем решении), который сохраняет список подписчиков и отправляет, одноадресно передает сообщения UDP им.
  2. Использование многоадресная передача UDP, но необходимо будет записать своего рода механизм, который заботился бы о надежной доставке для Вас (т.е. повторения, тайм-ауты, и т.д.). Это также означает, что необходимо получить ответ от клиентов.
  3. , Если Вы не боитесь экспериментальных транспортных протоколов, Вы могли бы посмотреть здесь для предложений.,
0
ответ дан 29 November 2019 в 23:48
поделиться

Вы могли бы хотеть изучить RFC 3208 "Спецификация Надежного транспортного протокола PGM".

Вот краткий обзор:

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

2
ответ дан 29 November 2019 в 23:48
поделиться

По сравнению с предыдущим годом должен смотреть на Норму (NACK-ориентированный на Надежную Многоадресную передачу) спецификация. Можно найти информация о Норме здесь .

протокол НОРМЫ разработан для обеспечения сквозной надежной передачи объемных объектов данных или потоков по универсальным службам маршрутизации многоадресного IP-пакета и услугам переадресации. НОРМА использует выборочное, отрицательное подтверждение (NACK) механизм для транспортной надежности и предлагает дополнительные механизмы протокола для проведения надежных сеансов многоадресной передачи с ограниченной "априорной" координацией среди отправителей и получателей

Это несколько очень хорошо известный в военном мире.

спецификации Нормы.

Источник Нормы

0
ответ дан 29 November 2019 в 23:48
поделиться

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

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

2
ответ дан 29 November 2019 в 23:48
поделиться

@epatel - я второй предложение SCTP (я голосовал, но еще не могу прокомментировать так дополнительный материал здесь).

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

3
ответ дан 29 November 2019 в 23:48
поделиться

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

Клиенты, затем вызовут Читайте (max_size = 2) на сокете, чтобы определить размер следующего сообщения, а затем Прочитайте (max_size = s) , чтобы собрать сообщение.

Вы получаете надежные, заказанные сообщения, простые. Вам не нужны рамки обмена сообщениями для этого.

1
ответ дан 29 November 2019 в 23:48
поделиться

Можно использовать Message Broker, например, ActiveMQ.
Опубликуйте свои сообщения в теме и попросите клиентов зарегистрировать длительную подписку на эту тему, чтобы они не пропустили ни одного сообщения, даже если они не находятся в сети.

Apache ActiveMQ - это центральная система сообщений. написанный на Java вместе с полным Клиент JMS. Однако Apache ActiveMQ предназначенный для связи по номеру протоколов типа Stomp и OpenWire вместе с поддержкой количество различных языков клиенты.

Поддержка клиентской платформы включает в себя c# и .net

.
2
ответ дан 29 November 2019 в 23:48
поделиться
Другие вопросы по тегам:

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