- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有以下在 C
中使用 Redis
的代码。以 hiredis
为基础。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <hiredis.h>
int main(int argc, char **argv) {
unsigned int j;
redisContext *c;
redisReply *reply;
const char *hostname = "MY-HOSTNAME";
int port = 6379;
const char *cert = NULL;
const char *key = NULL;
const char *ca = "MY-CA";
struct timeval tv = { 1, 500000 }; // 1.5 seconds
redisOptions options = {0};
REDIS_OPTIONS_SET_TCP(&options, hostname, port);
options.timeout = &tv;
c = redisConnectWithOptions(&options);
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);
}
if (redisSecureConnection(c, ca, cert, key, "sni") != REDIS_OK) {
printf("Couldn't initialize SSL!\n");
printf("Error: %s\n", c->errstr);
redisFree(c);
exit(1);
}
reply = redisCommand(c,"SELECT 0");
printf("SELECT DB: %s\n", reply->str);
freeReplyObject(reply);
redisFree(c);
return 0;
}
但是,它总是失败:
Couldn't initialize SSL!
Error:
错误是空白,我无法控制Redis
服务器。
如何调试?
redisSecureConnection(c, ca, cert, key, "sni")
似乎返回 -1
。
Wireshark
输出如下:
1027 26.554662 192.168.20.228 → 179.11.21.99 TCP 64 55480 → 30642 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=64 TSval=197044507 TSecr=0 SACK_PERM=1
1028 26.589376 179.11.21.99 → 192.168.20.228 TCP 60 30642 → 55480 [SYN, ACK] Seq=0 Ack=1 Win=28560 Len=0 MSS=1440 SACK_PERM=1 TSval=136342937 TSecr=197044507 WS=512
1029 26.589430 192.168.20.228 → 179.11.21.99 TCP 52 55480 → 30642 [ACK] Seq=1 Ack=1 Win=131328 Len=0 TSval=197044541 TSecr=136342937
1030 26.589625 192.168.20.228 → 179.11.21.99 TCP 52 55480 → 30642 [FIN, ACK] Seq=1 Ack=1 Win=131328 Len=0 TSval=197044541 TSecr=136342937
1033 26.625423 179.11.21.99 → 192.168.20.228 TCP 52 30642 → 55480 [FIN, ACK] Seq=1 Ack=2 Win=28672 Len=0 TSval=136342946 TSecr=197044541
1034 26.625499 192.168.20.228 → 179.11.21.99 TCP 52 55480 → 30642 [ACK] Seq=2 Ack=2 Win=131328 Len=0 TSval=197044577 TSecr=136342946
这表明没有尝试过 SSL
/TLS
,没有 Client Hello
等
如果我尝试使用 NodeJS
客户端,我会得到这个,并且一切正常:
902034 1181.706157 192.168.20.228 → 179.11.21.99 TCP 64 56765 → 30642 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=64 TSval=198187591 TSecr=0 SACK_PERM=1
902035 1181.742757 179.11.21.99 → 192.168.20.228 TCP 60 30642 → 56765 [SYN, ACK] Seq=0 Ack=1 Win=28560 Len=0 MSS=1440 SACK_PERM=1 TSval=106784830 TSecr=198187591 WS=512
902036 1181.742823 192.168.20.228 → 179.11.21.99 TCP 52 56765 → 30642 [ACK] Seq=1 Ack=1 Win=131328 Len=0 TSval=198187627 TSecr=106784830
902037 1181.744130 192.168.20.228 → 179.11.21.99 TLSv1 272 Client Hello
902039 1181.779023 179.11.21.99 → 192.168.20.228 TLSv1.2 1480 Server Hello
902040 1181.779026 179.11.21.99 → 192.168.20.228 TLSv1.2 912 Certificate, Server Key Exchange, Server Hello Done
最佳答案
您提供的示例代码是正确的并且应该可以工作,或者至少在所有配置错误的情况下产生有意义的错误消息。
获取没有任何错误消息的 REDIS_ERR
表示您的 hiredis 版本未使用 SSL/TLS 支持编译。
如果您自己构建 hiredis,请使用 make USE_SSL=1
来构建 SSL/TLS 支持,因为默认情况下它当前未启用。然后,您可以使用 gcc example.c libhiredis.a -o example -lssl -lcrypto
(在 Linux 上)之类的东西重新编译和重新链接您的示例。
关于c - hiredis 因 TLS 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57662058/
我正在开发一个简单的应用程序,它使用 Redis 的官方 C 客户端hiredis 的异步方面。作为第一步,我尝试编译the github repo 中的示例程序。 .我正在使用在 Ubuntu 20
我正在使用hiredis C library连接到我的 redis 实例。我正在考虑更改我的 redis.conf 以启用 requirepass 选项。我知道对于 redisConnect() 我只
我正在尝试使用 hiredis 编写连接池。我面临的问题是,如果用户触发命令但没有从连接读取响应,我应该在放入连接池之前清除该连接的响应。 有没有办法检查: 是否有更多数据要读取?所以我可以做 red
我正在使用 hiredis C client library在异步上下文中与 Redis 交互。 在我的工作流程的某些点上,我必须对 Redis 进行同步调用,但我无法从 Redis 获得成功响应。
我正在尝试在断开连接时重新连接到 Redis 服务器。 我正在使用 redisAsyncConnect 并且我已经设置了断开连接时的回调。在回调中,我尝试使用在程序开始时使用的相同命令重新连接以建立连
我正在使用 hiredis C 库连接到 redis 服务器。我不知道如何在订阅新消息后等待新消息。 我的代码如下: signal(SIGPIPE, SIG_IGN ); struct event
我正在为 Varnish 使用一个名为 libvmod-redis 的 redis 集成插件.我遇到一个问题,如果我收到大量并发请求(大约 350 个),redis 就会开始超时,最终我会在 Varn
我是 redis 新手。我想编写一个位于hiredis顶层的简单库(用于测试)。例如,为了实现 SET 命令,我编写了以下代码: #include #include #include #include
我正在尝试使用 hiredis 将结构SET 放入 Redis: struct StatLite { uid_t uid; gid_t gid; mode_t mode; }
我正在尝试在 CentOS 上以 C 运行 hiredis。 下面的代码似乎运行良好: ... const char *hostname = "my.redis-as-a-service.com";
我将 HiRedis 与 c/c++ 程序一起使用,并编写了一些测试来验证订阅是否有效(我的解决方案基于 this comment)。 但是,目前我只能通过在 redis-cli 终端中手动输入类似
reply = redisCommand(rcontext,"HGET %u %u",env->cr[3] ,KeyHandle); if(reply == NULL) { printf("in pr
如何使用 hiredis API 断开与 redis 服务器的连接?有 API 可以连接,但我找不到关闭连接的函数?redisFree 会自动执行此操作吗? 最佳答案 redisFree() 确实会关
我在多线程环境中使用 Redis,对它的运行方式有疑问。我在我的 c++ 应用程序中使用 hiredis c 库。 我的问题是:如果我在触发回调时使用异步模式,是否会在 Redis 客户端创建的另一个
我在 Kali Linux 2019.4 上使用以下命令安装了 Redis 服务器: $ redisurl="http://download.redis.io/redis-stable.tar.gz"
我想用 C 编译 redis 的客户端。我已经下载并安装了 libevent 库和 hiredis 文件。我用过这个命令: gcc -I/home/tasos/Dropbox/lists/hiredi
考虑以下示例: #include #include #include #include int main(int argc, char **argv) { redisContext *re
我有以下在 C 中使用 Redis 的代码。以 hiredis 为基础。 #include #include #include #include int main(int argc, char
我安装了redis服务器,可以从命令行使用它。现在,我想使用 hiredis 编写一个客户端程序。首先,我尝试编译 hiredis 目录中的 example.c: vishal@expmach:~/r
我正在尝试将一个多词字符串推送到一个 Redis 键但是每个词都被添加为一个新元素我怎样才能避免这种情况 #include #include #include #include int m
我是一名优秀的程序员,十分优秀!