2013-08-14 4 views
1

Я смущен предупреждением в api of zmq_poll: «Функция zmq_send() очистит все ожидающие события в сокете. Таким образом, если вы используете zmq_poll() для мониторинга ввода на сокет, использовать его и перед выходом, а также обрабатывать все события после каждого вызова zmq_poll(). "Использование zmq_poll и zmq_send() в одном сокете

Я не понимаю, что это значит. Поскольку события с уровнем запуска. Если я вызываю zmq_send(), а затем zmq_poll(), любые ожидающие сообщения в буфере сокета должны немедленно вызвать zmq_poll. Почему нужно «использовать его (zmq_poll) перед выходом» или «обрабатывать все события после каждого вызова zmq_poll()»?

+0

Я как-то с вами, но вы можете уточнить, что именно вы спрашиваете? Не уверен, что вы подразумеваете под _Why нужно «использовать его (zmq_poll) перед выходом» или «обрабатывать все события после каждого вызова zmq_poll()»? _ – raffian

+0

@raffian Я использую 'zmq_poll' для мониторинга ввода на два гнезда. И я также отправляю сообщения через один из этих двух сокетов. Это безопасно, если я делаю 'zmq_send()', прежде чем обрабатывать все входные сообщения в этом сокете? Я не хочу терять сообщения. – GuLearn

+0

@raffian Предложения в двойных кавычках скопированы из документа API, который я упомянул – GuLearn

ответ

1

Я вижу вашу точку зрения, документация в замешательстве. Вот простой тест на Java с использованием клиентского сокета DEALER с poller (от asyncsrv). Сервер отправляет клиенту 3 сообщения. Клиент проверяет и выводит каждое полученное сообщение. Я добавил send() в клиенте, чтобы проверить вашу теорию. Предполагая send() Очищает голосующий, мы ожидаем, что клиент для вывода получения только одного сообщения:

Сервер

public static void main(String[] args) { 
    Context context = ZMQ.context(1); 
    ZMQ.Socket server = context.socket(ZMQ.ROUTER); 
    server.bind("tcp://*:5555"); 

    server.sendMore("clientId"); 
    server.send("msg1"); 

    server.sendMore("clientId"); 
    server.send("msg2"); 

    server.sendMore("clientId"); 
    server.send("msg3"); 
} 


Client

public void run() { 
    socket = context.socket(ZMQ.DEALER); 
    socket.setIdentity("clientId".getBytes()); 
    socket.connect("tcp://localhost:5555"); 

    ZMQ.Poller poller = new ZMQ.Poller(1); 
    poller.register(socket, ZMQ.Poller.POLLIN); 

    while (true) { 
     poller.poll(); 
     if (poller.pollin(0)) { 
      String msg = socket.recvStr(0); 
      System.out.println("Client got msg: " + msg); 
      socket.send("whatever", 0); 
     } 
    } 
} 

выходы. ..

Client got msg: msg1 
Client got msg: msg2 
Client got msg: msg3 

На основании результатов, делая send() не очищает Poller для socket, и это должно быть понятно, почему. Мы настроили poller с POLLIN, что означает, что poller прослушивает входящие сообщений на socket. При выполнении socket.send() он создает исходящие сообщения, на которых не работает прослушиватель.

Надеюсь, это поможет ...

+0

Отличный ответ! Спасибо огромное! – GuLearn

+0

Я использую C++. Но я считаю, что привязки здесь не должны отличаться – GuLearn

Смежные вопросы