Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ZMQ не блокирующии сокеты 
V
    Опции темы
Master01
Дата 18.1.2012, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 22.8.2007

Репутация: нет
Всего: 2



Привет,

Есть вот такой код с использованием ZeroMQ. 2 потока , один отсылает реквесты, второй отвечает и т.д. в том виде как привелено ниже всё работает ок.
Но если изменить тип сокетов с ZMQ_REQ на ZMQ_XREQ или ZMQ_REP на ZMQ_XREP то всё валится - вылетают ексепшены при socket.recv или socket.send.
В чём может быть дело??
Такое чувство что я что-то не понял ...)))

VS2010 Express; ZMQ 3.1; Boost 1.48

Заранее спасибо!


Код

#include <zmq.hpp>

#include <boost\thread.hpp>

#include <iostream>



zmq::context_t * ctx = NULL;

void master()
{
    boost::this_thread::sleep(boost::posix_time::seconds(2)); 

    zmq::socket_t s (*ctx, ZMQ_REQ); //zmq::socket_t s (*ctx, ZMQ_XREQ);
    s.connect("inproc://workers");

    try {

        while(1) 
        {
            zmq::message_t req(5);
            memcpy(req.data(), "bbbbb", 5);
            s.send(req);

            boost::this_thread::sleep(boost::posix_time::seconds(5)); 

            zmq::message_t rep;
            s.recv(&rep);

            std::string str((char *) rep.data(), rep.size());
            std::cout << boost::this_thread::get_id() << "received : " << str << std::endl;
        }

    }catch(zmq::error_t e) {
        const char * s = zmq_strerror(e.num());
        std::cout << s << std::endl;
    }
}


void main()
{
    ctx = new zmq::context_t (1);

    zmq::socket_t s(*ctx, ZMQ_REP);   // zmq::socket_t s(*ctx, ZMQ_XREP);
    s.bind("inproc://workers");
    boost::thread( boost::bind(&master));

    for (int i = 0; i < 5; i++)
    {
        zmq::message_t rep;
        s.recv(&rep,1);

        std::string str((char *) rep.data(), rep.size());
        std::cout << boost::this_thread::get_id() << "received " << str << std::endl;

        zmq::message_t req(5);
        memcpy(req.data(), "aaaaa", 5);
        s.send(req);

        boost::this_thread::sleep(boost::posix_time::seconds(3));
    }
}

 


PM MAIL   Вверх
tzirechnoy
Дата 18.1.2012, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



1) При чём тут XREQ и неблокирующиеся операцыи? Это совсем несвязанные вещи.
2) При связывании XREQ с REP обязательно использовать multi-part messages. Это как минимум. Usage patterns раскиданы по всей сети, но я сейчас не вижу, зачем они были бы Вам нужны.
PM MAIL   Вверх
Master01
Дата 19.1.2012, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 22.8.2007

Репутация: нет
Всего: 2



Ха-ха. smile Да я уже всё разобрался. Согласен, вопрос глупый был.

Просто надо было разобраться с этой библиотекой. Думал снаскока по-быстрому, в инете что-то почитал .... 

Вообщем, в зависимости от типа сокет довешивает/снимает обертки (envelopes), например РОУТЕР довешивает адрес возврата и пр. Это всё пересылается как multipart месаги, т.о. нужно считывать все части из сокета или использовать сокеты которые всё лишнее снимут сами, как например REP.

Библиотека зачётная только Guide на оффиуиальном сайте Достоевский писал - читается как художественное произведение, что сбивает.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0608 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.