Я хотел бы настроить межпроцессное взаимодействие с использованием сокетов между сервером и несколькими клиентскими процессами с использованием C ++. Сервер и все клиентские процессы будут работать на одном компьютере с Windows 7. Предполагается, что std::vector
данных будет храниться на сервере и передается каждому клиенту. Время от времени вектор, содержащийся на сервере, будет расширяться (push_back()
) с дополнительными элементами данных и дополнительные данные необходимо будет передавать каждому клиенту. Может ли кто-нибудь предоставить ссылки на примеры того, как это сделать, соответствующие справочные материалы или простой пример «игрушечного» кода?
РЕДАКТИРОВАТЬ: После дальнейшего расследования я обнаружил, что Winsock будет подходящим. В поиске Google есть много примеров того, как настроить сервер Winsock. & расположение клиента. ОДНАКО меньше информации о том, как на самом деле передавать данные через сокеты. Может кто-нибудь рассказать о том, как синхронизировать std::vector
между сервером и клиентами через сокетную связь? Каждому клиенту нужно будет указать, по какому элементу индекса он уже был передан, и сервер будет обслуживать только те элементы, которых у клиента еще не было.
Если вы хотите управлять протоколом выше уровня tcp / udp, попробуйте Libevent или же Boost.Asio. Если вас больше интересует просто возможность передавать сообщения, посмотрите на что-то вроде ZeroMQ или же AMQP.
Пример сервера с использованием ZeroMQ
#include <iostream>
#include <zmq.hpp>
int main(int argc, const char* argv[])
{
// create a ZeroMQ network context using 1 thread
zmq::context_t ctx(1);
// We are 'UPSTREAM' i.e. a receiver
zmq::socket_t sock(ctx, ZMQ_UPSTREAM);
sock.connect("tcp://localhost:12345");
zmq::message_t msg;
while (sock.recv(&msg)) {
std::cout << "rx: " << (const char*)msg.data() << std::endl;
}
}
Если процессы всегда будут выполняться на одном и том же сервере, вы можете использовать Boost.Interprocess вместо сокетов для обработки сообщений.