Простая широковещательная библиотека / пример на C / C

#c #c #sockets #broadcast

#c #c #сокеты #Широковещательная

Вопрос:

Я собираю клиентско-серверное приложение, написанное на C / C . В основном это C с некоторыми функциями C — я родом из мира C и Java и не использую множество сложных функций языка C . В любом случае сервер находится на одном компьютере и выполняет различные внутренние вычисления, и несколько раз в день (в непредсказуемое время) он будет транслировать информацию некоторому количеству клиентов (находящихся на других компьютерах), которые зарегистрировались на сервере для прослушивания таких широковещательных сообщений. Сервер должен быть способен осуществлять широковещательную передачу всем зарегистрированным клиентам со 100% надежностью и очень быстро, чтобы клиенты могли обновлять свои собственные внутренние данные, отражающие изменение состояния сервера — изменение состояния, которое сервер только что передал им. Поскольку она должна быть надежной, это должен быть TCP / IP, а не UDP.

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

Спасибо.

Комментарии:

1. пожалуйста, измените тег broadcast на multicast — это не применимо к вопросу

Ответ №1:

Ознакомьтесь boost::asio . Их примеры доступны здесь: http://www.boost.org/doc/libs/1_38_0/doc/html/boost_asio/examples.html

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

Комментарии:

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

2. У Boost слишком большие накладные расходы и слишком крутая кривая обучения. Я ищу что-то более легкое. И, возможно, мне нужен протокол более высокого уровня, чем TCP, для обеспечения надежности? Предложения?

Ответ №2:

Для сетевых коммуникаций на C / C из свободного мира с открытым исходным кодом есть две библиотеки, которые отлично подходят — LibEvent и Boost.Asio. Используя их, вам не нужно будет углубляться в особенности операционной системы или конкретных API для сетевых коммуникаций. У них обоих есть хорошая документация и набор достойных примеров.

В качестве дополнительного примечания, даже использование TCP / IP не делает протокол связи надежным с более высокой точки зрения. Для обеспечения надежности приложения обычно определяют протоколы более высокого уровня поверх TCP / IP. Эти протоколы описывают последовательность сообщений, сердцебиения, поддержку повторной передачи и так далее. Существуют также надежные протоколы, построенные поверх UDP (так называемый RUDP).

Если вы чувствуете, что скорость и надежность очень важны, вы можете захотеть использовать одну из ведущих в отрасли технологий, таких как Tibco, LBM (Informatica / 29West) или Tervela. Все эти решения могут работать поверх различных протоколов связи, предоставляя пользователю бесшовный API.

Комментарии:

1. Вы поднимаете хороший вопрос о надежности. Я рад использовать протокол очень высокого уровня, который обеспечивает надежность — например, если сокет в какой-то момент будет удален (потому что ничего не происходит в течение нескольких часов) Я бы хотел, чтобы она автоматически переподключалась / решала проблему за меня. Какой протокол высокого уровня вы бы предложили и какая библиотека Windows реализует это?

2. Единственный известный мне бесплатный поставщик с открытым исходным кодом — ZeroC Ice (zeroc.com ). Их решение немного отличается от чистого обмена сообщениями, оно больше похоже на CORBA. Они поддерживают автоматическое восстановление соединения (фактически, они не поддерживают его, если вы им не пользуетесь, но это можно отключить при желании), и они надежны, если вы не используете односторонние вызовы.

3. ZeroC Ice выглядит интересно, но это GPL. Я ищу что-нибудь без ограничений GPL. Спасибо за помощь, хотя теперь я знаю больше, чем когда начинал. 🙂

Ответ №3:

Для этого потребуется приличное количество функций C (шаблонов и т.д.), Но boost::asio превосходен и именно то, что вам нужно для этой задачи. Однако к этому явно потребуется некоторое привыкание, поскольку модель программирования сильно отличается от обычного C . На сайте есть довольно хорошая документация и множество примеров.

Комментарии:

1. Я слышал, что накладные расходы на повышение огромны, а кривая обучения крутая. Я надеюсь на что-то другое, кроме Boost.

2. Накладные расходы на повышение и кривая обучения очень разумны. Преимущество использования boost намного перевешивает стоимость.