Доброго дня!
Пишу приложение клиент-сервер, использую БД 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);
}