LINUX.ORG.RU

Выбор zmq сокета

 ,


0

2

Задача, есть некоторый сервер, который слушает некоторое, заранее известное, кол-во клиентов.
Сервер получает от них сообщение обрабатывает без ответа. Так же сервер может в определенных ситуациях слать сообщения определенным клиентам.
Клиент может подождать, если с сервером уже кто-то общается.
Так же крайне желательно обойтись всего 1 сокетом на принимающей стороне. Request- response сокеты отпадают из-за своего четкого режима работы запрос-ответ. Что посоветуете?

★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

Ответ на: комментарий от vertexua

router все-таки нужен для передачи сообщений от одного клиента другому клиенту через сервер. Я поначалу пытался через pair сокеты все это сделать, организовав работу так, чтоб клиент соединялся с сервером, посылал сообщение и сразу отсоединялся, но судя по всему пары так работать не могут.

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

router как и все остальные типы сокетов не нужны ни для чего конкретного. У них просто есть поведение и все.

Так вот, твой REQ клиент будет отправлять сообщения. А ROUTER будет получать multipart сообщения с адресом клиента. Отвечать тоже нужно именно такими multipart сообщенями и ROUTER ответит в нужное соединение. REQ опять получит чистый ответ.

Попробуй, отправь в REQ и посмотри что получил в ROUTER

vertexua ★★★★★
()

pure c, zeromq

взаимоисключил же

выбирай pure c.

ukr_unix_user ★★★★
()
Ответ на: комментарий от vertexua

Попробовал, и честно - ничерта, не понял server - http://pastebin.com/AKEFXUJ5 client - http://pastebin.com/yEi47tEY

запускаю сервер и клиент. Вот это вижу на сервере

$ ./hwserver 
Received 
Received 
Received first

На клиенте
$ ./hwclient first
Connecting to hello world server...
Sending Hello 0...

Что вообще произошло? Почему сервер совершил 3 цикла, что было в первых двух, если сообщение от клиента описано только в 3-ем?

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

Именно так работает эта парочка сокетов вместе.

Вася говорит: Чебурек

Сервер получает: (Вася, <пусто>, Чебурек).

Скобки значат multipart естественно.

В твоем случае «Вася» не назначил себе имя. Я всегда думал что в таком оно сгенерируется автоматически, а у тебя и первое сообщение пустое почему-то. Может просто так криво вывелось на экран. Но вообще клиенту лучше явно генерировать имя. Поищи в манах как его установить для клиента.

Как отвечать?

Сервер должен писать в свой ROUTER точно такими же триплетами.

Сервер: (Вася, <пусто>, Чебурек получен), (Петя, <пусто>, Еще чебурек)

Вася и Петя - имена. Это дает более легкую в большинстве случаев абстракцию над подключениями. Они сериализируемые, они прозрачно переживают переподключение. Было бы тяжелее если бы это был бы какой-то socket_t

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)

REQ/REP (XREQ/XREP) + PUB/SUB (XPUB/XSUB)

Вообще то тут с позиций масштабирования проблема мультикаст раздачи, которую 0MQ решить пока эффективно не может

westtrd
()

Я зашёл в этот тред, что бы написать эрланг.

nanoolinux ★★★★
()
Ответ на: комментарий от vertexua

Попытался сделать по вашему объяснению. Понимание конечно улучшилось, но все равно выглядит это как-то странно. Сервер - http://pastebin.com/RzJsNLvz Клиент - http://pastebin.com/myvpgaXY Клиент выводит вот это

$ ./hwclient first
Connecting to hello world server...
Sending Hello 0...
Hello was send
Sending Hello 1...
Hello was send
Sending Hello 2...
Hello was send
Sending Hello 3...
Hello was send
Sending Hello 4...
Hello was send
Sending Hello 5...
Hello was send
Sending Hello 6...
Hello was send
Sending Hello 7...
Hello was send
Sending Hello 8...
Hello was send
Sending Hello 9...
Hello was send
Вывод сервера
$ ./hwserver 
Received CLIENT
Received CLIENT
Received 
Received first
Почему дважды получается имя отправителя? Почему клиент отправляет 10 сообщений, а сервер получает только одно?

LIKAN ★★★
() автор топика
Ответ на: комментарий от vertexua

Так, ну почему принимает только 1 раз - ясно, только вот почему я дважды вижу

Received CLIENT
Received CLIENT
я не понимаю. Я переделал сервер вот таким образом
#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>

int main (void)
{
    // Socket to talk to clients
    void *context = zmq_ctx_new ();
    void *responder = zmq_socket (context, ZMQ_ROUTER);
    //zmq_setsockopt (responder, ZMQ_IDENTITY, "SERVER", 6);
    int rc = zmq_bind (responder, "tcp://*:5555");
    assert (rc == 0);
    int i=0;
    zmq_msg_t buffer;
    while (1) {
        zmq_msg_init (&buffer);
        rc=zmq_msg_recv( &buffer, responder, 0 );
        printf ("Received %s\n",zmq_msg_data(&buffer));
        zmq_msg_close (&buffer);
        //zmq_send (responder, strcat(buffer, ",Hello"), 6 + strlen(buffer) + 1, 0);
    }
    return 0;
}
Клиент
#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>


int main (int argc, char * argv[])
{
    if(argc != 2){
        printf("Not enogh arguments\n");
        return -1;

    }
    printf ("Connecting to hello world server...\n");
    void *context = zmq_ctx_new ();
    void *requester = zmq_socket (context, ZMQ_REQ);
    zmq_setsockopt (requester, ZMQ_IDENTITY, "CLIENT", 6);
    zmq_connect (requester, "tcp://localhost:5555");
    int rc;
    int request_nbr;
    for (request_nbr = 0; request_nbr < 5; request_nbr++) {
        char buffer [255];
        printf ("Sending Hello %d...\n", request_nbr);
        sleep(1);
        rc=zmq_send (requester, argv[1], strlen(argv[1])+ 1, 0);
        if(rc == -1){
            perror("Can't send\n");
        }
        printf("Hello was send\n");
        //zmq_recv (requester, buffer, 255, 0);
    }
    zmq_close (requester);
    zmq_ctx_destroy (context);
    return 0;
}

На сервере я вижу вот это

$ ./hwserver 
Received CLIENT
Received З
Received first
Что за 3?

LIKAN ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.