Я пытаюсь Zeromq Привет мир пример для сервера и клиента. ниже приведен пример кода
//
// Hello World client in C++
// Connects REQ socket to tcp://localhost:5555
// Sends "Hello" to server, expects "World" back
//
#include <zmq.hpp>
#include <string>
#include <iostream>
int main ()
{
// Prepare our context and socket
zmq::context_t context (1);
zmq::socket_t socket (context, ZMQ_REQ);
std::cout << "Connecting to hello world server…" << std::endl;
socket.connect ("tcp://localhost:5555");
// Do 10 requests, waiting each time for a response
for (int request_nbr = 0; request_nbr != 10; request_nbr++) {
zmq::message_t request (6);
memcpy ((void *) request.data (), "Hello", 5);
std::cout << "Sending Hello " << request_nbr << "…" << std::endl;
socket.send (request);
// Get the reply.
zmq::message_t reply;
socket.recv (&reply);
std::cout << "Received World " << request_nbr << std::endl;
}
return 0;
}
и код сервера
//
// Hello World server in C++
// Binds REP socket to tcp://*:5555
// Expects "Hello" from client, replies with "World"//
#include <zmq.hpp>
#include <string>
#include <iostream>
#include <unistd.h>
int main () {
// Prepare our context and socket
zmq::context_t context (1);
zmq::socket_t socket (context, ZMQ_REP);
socket.bind ("tcp://*:5555");
while (true) {
zmq::message_t request;
// Wait for next request from client
socket.recv (&request);
std::cout << "Received Hello" << std::endl;
// Do some 'work'
sleep (1);
// Send reply back to client
zmq::message_t reply (5);
memcpy ((void *) reply.data (), "World", 5);
socket.send (reply);
}
return 0;
}
Код работает нормально, я могу отправить запрос и получить ответ.
Но я хочу, чтобы сервер не ждал запроса от клиента. Сервер продолжает работать, и если приходит запрос от клиента, он дает ответ.
Какие изменения я могу внести в программу, чтобы добиться этого.
Вы должны работать с потоком, чтобы сделать это.
Для примера с Boost thread
http://thisthread.blogspot.fr/2011/08/multithreading-with-zeromq.html
Вы можете попробовать ZMQ_PUSH/ZMQ_PULL
комбинация, чтобы сделать клиентские запросы неблокирующая.
Если вы хотите выйти за рамки привет, вы можете посмотреть на архитектуру Push Framework. Что вы имеете в виду, когда сервер продолжает работать? Вы имеете в виду многопоточность? Скорее всего, вы не хотите этого делать. Если вы хотите масштабировать свое приложение для большого количества клиентов, вам, вероятно, стоит проверить балансировки нагрузки
Сокет сервера будет собирать сообщения асинхронно для вас в фоновом режиме. Обычно вы собираете сообщения последовательно в одном месте сервера и отправляете реакции на сообщения для дальнейшей обработки по вашему желанию — асинхронно или нет.