Я использую zeromq (последняя версия, 2012.04.04), c++, ms vs 2008 (релиз/отладка x86), windows 7 x64. Я пытаюсь закодировать простую клиент-серверную систему.
Проблема
Моя проблема заключается в мертвом зависании компьютера при выполнении команды recv() в Windows 7, когда много клиентов одновременно подключаются к серверу.
В Windows Vista результат такой же, как и в Windows XP - у клиента ошибка:
http://research.makseq.com/testZMQ/2.Vista.png
http://research.makseq.com/testZMQ/1.PNG
После этого сбоя клиенты не могут подключиться к серверу, пишут:
"Ошибка утверждения: Адрес уже используется: ... "
Вот исходный код:
http://research.makseq.com/testZMQ/testZMQ.rar
Как использовать:
1) "testZMQ.exe сервер" для запуска сервера,
2) нажмите Enter и удерживайте «testZMQ.exe», чтобы запустить много-много-много клиентов.
Попробуйте запустить сервер несколько раз: Я думаю, что этот баг происходит, когда сервер запускался два и более раз.
#include "stdafx.h"
#include "../Libraries/zeromq/include/zmq.h"
#include "../Libraries/zeromq/include/zhelpers.hpp"
#include <string>
using namespace std;
#ifdef WIN32
#pragma comment(lib, "../Libraries/zeromq/libzmq.lib")
#endif
//-----------------------------------------------------------------------------
int server()
{
cout << ":: Server ::" << endl;
zmq::context_t context(1);
zmq::socket_t server(context, ZMQ_REP);
server.bind("tcp://*:7774");
while (1) {
// receive
zmq::message_t messageR;
cout << "debug point 1" << endl;
server.recv(&messageR); // <== dead hanging here
cout << "debug point 2" << endl;
string recieved = string(static_cast<char*>(messageR.data()), messageR.size());
// send
string reply = "do something";
zmq::message_t messageS(reply.size());
memcpy(messageS.data(), reply.data(), reply.size());
cout << "debug point 3" << endl;
server.send(messageS);
cout << "debug point 4" << endl;
}
return 0;
}
//-----------------------------------------------------------------------------
int client()
{
cout << ":: Client ::" << endl;
// connect
zmq::context_t context(1);
zmq::socket_t *client = new zmq::socket_t (context, ZMQ_REQ);
client->connect("tcp://localhost:7774");
int linger = 0;
client->setsockopt (ZMQ_LINGER, &linger, sizeof (linger));
// send
string reply = "hello";
zmq::message_t messageS(reply.size());
memcpy(messageS.data(), reply.data(), reply.size());
client->send(messageS);
// receive
zmq::message_t messageR;
client->recv(&messageR);
string recieved = string(static_cast<char*>(messageR.data()), messageR.size());
// close
client->close();
delete client;
zmq_term(&context);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
if (argc == 2) server();
else client();
return 0;
}
Что я делаю неправильно?