我使用zeromq(最新版本,2012.04.04),c ++,ms vs 2008(x86版本/调试),Windows 7 x64。我尝试编写简单的客户端-服务器系统代码。

问题

我的问题是,当许多客户端同时连接到服务器时,Windows 7上的recv()命令导致计算机死机。

在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;
}


我做错了什么?

最佳答案

recv是阻止呼叫。直到有东西连接,它才会坐在那里等待。这不是死路一条,只是在等待连接。

10-04 13:28