Задать вопрос

Как заставить работать ZeroMQ+hiredis?

Доброго дня!

Пишу приложение клиент-сервер, использую БД redis+библиотека hiredis и общаюсь с клиентом через ZeroMQ, язык Си, Linux Debian, сервер редиса включен. Задача простая - клиент посылает сообщение "Test", сервер отвечает "ok", при этом редис подключен. Если я её решу, буду дописывать реакции на всякие запросы к редису, пока на этом этапе застрял. Я начинающий в этих вопросах, поэтому не судите строго. После запуска сервера, коннекта с ним клиента, любое сообщение клиента вызывает аварийную остановку сервера с сообщением "Assertion failed: check () (src/msg.cpp:230)
Аварийный останов
"
Выяснил что это происходит если есть строка "c = redisConnectWithTimeout(hostname, port, timeout);"
Соединение с редисом работает нормально.

Вот код сервера:

#include "czmq.h"
#include "stdio.h"
#include "unistd.h"
#include "string.h"
#include "assert.h"
#include "hiredis.h"
#include <stdlib.h>

int main (void)
{
    void *context = zmq_ctx_new ();
    void *server = zmq_socket (context, ZMQ_REP);
    int rc = zmq_bind (server, "tcp://*:5555");	

    redisContext *c;
    redisReply *reply;
    const char *hostname = "127.0.0.1";
    int port = 6379;

struct timeval timeout = { 1, 500000 }; // 1.5 seconds
c = redisConnectWithTimeout(hostname, port, timeout);

    if (c == NULL || c->err) {
        if (c) {
            printf("Connection error: %s\n", c->errstr);
            redisFree(c);
        } else {
            printf("Connection error: can't allocate redis context\n");
        }
        exit(1);
    }

    reply = redisCommand(c,"PING");
    printf("PING: %s\n", reply->str);
    freeReplyObject(reply);

while (1) {
	zmq_msg_t msg;
	int rc = zmq_msg_init (&msg);
	assert (rc == 0);
	rc = zmq_msg_recv (&msg, server, 0);
	assert (rc != -1);	
	char src[rc];
	memcpy (src, zmq_msg_data(&msg), rc);
	printf("%s\n",src);
	sleep(1);
	zmq_msg_close (&msg);
	rc = zmq_msg_init_size (&msg, 3);
	assert (rc == 0);
        memcpy (zmq_msg_data (&msg), "ok\0",	3);
	rc = zmq_msg_send (&msg, server, ZMQ_DONTWAIT); 
	sleep(1);
}
    redisFree(c);
    return 0;
}

КОД КЛИЕНТА

#include "czmq.h"

int main (void)
{
    void *context = zmq_ctx_new ();
    void *client = zmq_socket (context, ZMQ_REQ);
    zmq_connect (client, "tcp://localhost:5555");
        zmq_msg_t msg;
	int rc = zmq_msg_init_size (&msg, 5);
	assert (rc == 0);
        memcpy (zmq_msg_data (&msg), "Test\0",	5);
	rc = zmq_msg_send (&msg, client, ZMQ_DONTWAIT); 
	sleep(1);
	rc = zmq_msg_init (&msg);
	assert (rc == 0);
	rc = zmq_msg_recv (&msg, client, 0);
	assert (rc != -1);
	char txt[sizeof(zmq_msg_data(&msg))];
	strcpy (txt, zmq_msg_data(&msg));
	printf("%s\n",txt);
 return 0;
    zmq_close (client);
    zmq_ctx_destroy (context);
zmq_msg_close(&msg);
}
  • Вопрос задан
  • 47 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
18 дек. 2024, в 12:39
1000 руб./за проект
18 дек. 2024, в 12:37
10000 руб./за проект
18 дек. 2024, в 12:22
5000 руб./за проект