Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Реализация обмена между программами инофрмацией


Автор: drayvhard 5.11.2013, 21:38
Здравствуйте, ребята!
Вот у меня возникла проблема реализации обмена данных между программами (серверами и клиентами)

Пусть у сервера есть std::vector<double> и он постоянно обновляется, независимо от клиентов, то есть наполняется... В определённый момент  (я думаю, что в данном контексте лучше всего использовать сокеты, хоть и сервер и клиен работает на одном компе, но сокеты ближе, чем named pipes... нужна возможность работы и по сети... хотя кажется pipes могут работать и через сеть... но не в этом дело), клиент подключается к серверу и говорит: "мне нужен контент твоего супер вектора", после этого нужно отослать весть контент этому клиенту...
Скажите пожалуйста, как такое реализовать? Хотя бы идею... Пусть к этому серваку может быть подключено энное количесво клиентов... и всех нужно обработать...

Далее, больше... пусть сервак всё отослал клиентам и ждёт с "моря погоды", и тут в него поступают новые данные... Сервер должен как-то всех клиентом оповестить и отослать эти данные... Как тут поступить? Постоянно держать сокет открытым на R/W между клиентами и сервером? Это типа пуш такой будет?

Ну и третье: пусть на одном компе есть туча клиентов, которые подключаються к СерверАМ. То-есть мы имеем на одном компе 2 серверных приложения... как к ним обращаться по отдельности? Ведь хост тотже будет? Дифференцировать их по номеру порта? или каким то другим образом? 

Буду рад идеям и помощи...Спасибо!

Автор: bsa 5.11.2013, 21:53
Цитата(drayvhard @  5.11.2013,  22:38 Найти цитируемый пост)
Скажите пожалуйста, как такое реализовать?
сокет - это по сути файл, открытый на чтение/запись. Бери и записывай свой вектор в него. Можешь в двоичном виде, если уверен, что платформы сервера и клиента полностью совпадают, или в текстовом, или использовать сереализацию (см. например boost serialization).
Цитата(drayvhard @  5.11.2013,  22:38 Найти цитируемый пост)
Как тут поступить? Постоянно держать сокет открытым на R/W между клиентами и сервером? Это типа пуш такой будет?
Это смотря что для тебя выгодней. Если клиентов мало, а данные обновляются часто, то тогда выгодней держать сокет открытым. Если клиенты мобильные или данные обновляются редко, то лучше пусть они каждый раз запрашивают изменения (например, ревизию данных, которая инкрементируется при каждом их изменении на стороне сервера, а клиенту передается вместе с данными).
Цитата(drayvhard @  5.11.2013,  22:38 Найти цитируемый пост)
Дифференцировать их по номеру порта?
только так и можно. для этого собственно порты и придуманы были.

Автор: drayvhard 5.11.2013, 22:06
Цитата(bsa @ 5.11.2013,  21:53)
Цитата(drayvhard @  5.11.2013,  22:38 Найти цитируемый пост)
Скажите пожалуйста, как такое реализовать?
сокет - это по сути файл, открытый на чтение/запись. Бери и записывай свой вектор в него. Можешь в двоичном виде, если уверен, что платформы сервера и клиента полностью совпадают, или в текстовом, или использовать сереализацию (см. например boost serialization).
Цитата(drayvhard @  5.11.2013,  22:38 Найти цитируемый пост)
Как тут поступить? Постоянно держать сокет открытым на R/W между клиентами и сервером? Это типа пуш такой будет?
Это смотря что для тебя выгодней. Если клиентов мало, а данные обновляются часто, то тогда выгодней держать сокет открытым. Если клиенты мобильные или данные обновляются редко, то лучше пусть они каждый раз запрашивают изменения (например, ревизию данных, которая инкрементируется при каждом их изменении на стороне сервера, а клиенту передается вместе с данными).
Цитата(drayvhard @  5.11.2013,  22:38 Найти цитируемый пост)
Дифференцировать их по номеру порта?
только так и можно. для этого собственно порты и придуманы были.

А в нашем случае, что будет надёжнее и быстрее из методов IPC: сокеты, shared memmory или named pipes?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)