Как обмениваться данными с помощью сетевого программирования C++?
------------------ обновление 2015.12.13---------------
На данный момент я разрабатываю программу, которая имеет сетевую функцию на Windows
Предположим, что есть четыре ПК, я выбираю один в качестве главного узла, а другие - подчиненные узлы. Ведомые узлы должны передавать XML-файлы (только один раз) и некоторую другую информацию в режиме реального времени (например, передавать данные каждые 5 секунд) ведущему узел.
У меня нет знаний о сетевом программировании. Существует ли фреймворк, способный справиться с этим?
Что касается решения этой проблемы, у меня есть основные моменты, которые я не могу сделать выбор:
какая библиотека или фреймворк проста в использовании?
winsocket
?POCO
?QT networkframe
или другие?какой уровень сети мне следует сфокусировать?
socket
? или просто используя уже упакованныйHTTP request
так что не нужно заботиться о реализации сокета?Из-за необходимости передавать некоторую информацию в реальном времени, есть ли какие-то важные моменты для проектирования этой сетевой функции?
2 ответа
Одной из возможностей было бы полное абстрагирование "сетевой" части и использование одного из множества механизмов RPC, поэтому клиенты просто передают параметры функции, и вскоре после этого на вашем сервере вызывается функция с теми же параметрами.
Просто для одного примера, я использовал Apache Thrift несколько раз. Недавно я также немного поработал, используя Google RPC. Оба, кажется, работают, хотя Thrift определенно более зрелый из двух. В зависимости от ваших потребностей, существует довольно много возможностей для выбора.
Есть много способов сделать это. Самым простым является не использовать сетевой API как таковой. Используйте файловую систему. Подчиненные могут записывать на сервер, и сервер подберет файлы после того, как подчиненное устройство завершит запись. Вы можете зависеть от окон для принудительного применения SHARE_READ / SHARE_WRITE. Если клиент создает файл с помощью SHARE_NONE, то никто другой не сможет открыть файл, пока он не закроет его. Это приведет к ошибке только в том случае, если клиент разорвет сетевое соединение, произойдет сбой и т. Д. Более надежный способ для клиента - создать файл с именем, например "\server-name\sharename\CLIENT_X_TEMP.xml", и когда он будет готов. чтобы сервер использовал его, переименуйте его в "\server-name\sharename\SERVER_PLEASE_README_NOW.xml". Сервер будет искать только файлы с правильным именем. Кажется, что это не очень технологично, но безопасно, портативно, надежно и легко для работы. Поскольку вам не нужны специальные API, вы можете написать клиент и сервер на любом языке, который имеет доступ к файловой системе.
Если вы хотите использовать прямые сетевые API, вы можете использовать DCOM. Это позволяет вам указать интерфейс, подобный C/C++, для вызова клиентом и реализации сервера. Он имеет дело со всей сложностью сериализации данных и их переноса на другую машину. Это действительно гибко, клиент и сервер находятся в одном процессе, в разных процессах на одном и том же компьютере или на разных машинах. (Microsoft называла эту технологию многими именами на протяжении многих лет. "Базовым" уровнем является "RPC", затем COM, D-COM, ActiveX, возможно, некоторые другие имена.
Сокеты довольно просты в настройке и более легко переносимы, чем DCOM, но довольно "сыры". Вам нужно будет придумать свой собственный протокол для отправки данных, так как сокеты просто транспортируют пакеты данных.
HTTP - это просто протокол, который обычно передается через сокеты. Преимущество здесь состоит в том, что доступно несколько различных HTTP-библиотек и несколько готовых серверов. Например, IIS может использоваться для обработки входящих запросов и автоматической передачи их в ваш код - вы можете кодировать свой сервер несколькими способами, и Microsoft Visual Studio имеет довольно хорошую поддержку для этого.
Я не использовал Poco или QT, поэтому я не могу комментировать.