【问题标题】:Getting credis to work in a C++ solution让 credis 在 C++ 解决方案中工作
【发布时间】:2013-03-21 16:56:51
【问题描述】:

我正在开发一个必须连接到 redis 数据库的 C++ 项目。我试图让credis 代码工作,但是当我编译它时,我得到了这些错误集

1>c:\c++redis\credis.c(728): warning C4013: 'fcntl' undefined; assuming extern returning int
1>c:\c++redis\credis.c(728): error C2065: 'F_GETFL' : undeclared identifier
1>c:\c++redis\credis.c(729): error C2065: 'F_SETFL' : undeclared identifier
1>c:\c++redis\credis.c(729): error C2065: 'O_NONBLOCK' : undeclared identifier
1>c:\c++redis\credis.c(734): error C2065: 'EINPROGRESS' : undeclared identifier
1>c:\c++redis\credis.c(740): warning C4133: 'function' : incompatible types - from 'int *' to 'char *'

错误在credis.c文件的第728行到第746行

/* connect with user specified timeout */
flags = fcntl(fd, F_GETFL);
if ((rc = fcntl(fd, F_SETFL, flags | O_NONBLOCK)) < 0) {
DEBUG("Setting socket non-blocking failed with: %d\n", rc);
}

if (connect(fd, (struct sockaddr *)&sa, sizeof(sa)) != 0) {
if (errno != EINPROGRESS)
    goto error;

if (cr_selectwritable(fd, timeout) > 0) {
    int err;
    unsigned int len = sizeof(err);
    if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &err, &len) == -1 || err)
    goto error;
}
else /* timeout or select error */
    goto error;
}
/* else connect completed immediately */

在哪里可以找到这些缺失的类型名称?

我正在使用 Visual Studio 2010 编译它,程序必须在窗口上运行。

我已尝试使用this 建议的答案对代码进行批处理,但这没有帮助。

【问题讨论】:

  • @Downvoter 为什么?我需要修改哪些内容才能让您更清楚地了解这个问题?
  • @jalf 已修复,对此感到抱歉。

标签: c++ c visual-studio-2010 window redis


【解决方案1】:

您至少缺少一个头文件:

#include <fcntl.h>

这应该可以解决您的一些问题。通常,查找头文件名的好地方是函数本身的帮助文本。在这种情况下,头文件与函数具有相同的名称(fcntl),但大多数都不是那么容易。

EINPROGRESS定义在:

#include <errno.h>

为了将来参考,E 前缀通常意味着它是一个错误宏,所以errno.h 是第一个查看的位置。

'function' : incompatible types - from 'int *' to 'char *' 可能意味着您的原型不匹配。您的原型与函数本身不匹配。更新原型。

编辑: 虽然这将解决您的一些问题,但似乎这是 UNIX 代码(请参阅 cmets)。例如,F_GETFLF_SETFL 在 Windows 上似乎不受支持。 O_NONBLOCK 在 UNIX 上位于 unistd.h

您将需要重写需要此功能的代码部分,或者更好的是,从您的供应商处获取 Windows 版本。

从您更新的帖子中,这些都是使用套接字完成的。套接字相当便携,但存在一些问题。对于非阻塞套接字,在 Windows 上使用 ioctlsocket()

例子:

int iRetn = ioctlsocket(s, FIONBIO, 1);

其中s为socket,第三个参数为0表示阻塞,非0表示非阻塞。

在使用任何套接字例程之前,您还需要#include &lt;winsock.h&gt; 和调用WSAStartup(),最后调用WSACleanup()

(老实说,这就是我现在所能想到的,我没有意识到我会回答关于套接字的问题)。

【讨论】:

  • 谢谢,这解决了一半的错误。 F_GETFL, F_SETFL, O_NONBLOCK 仍然报错但是其他的都消失了。
  • 澄清一下,一旦我包含这些文件,fcntlEINPROGRESS1 就会“消失”。
  • @Caesar:好的,试试:#include &lt;sys/types.h&gt;#include &lt;sys/stat.h&gt;
  • @Caesar:这有 UNIX 代码的味道。你确定这是 Windows 版本?
  • 我已经阅读了有关在 Windows 中使用它的人的信息,这是我能找到下载的唯一版本。但是,是的,这似乎是一个 unix 代码。
【解决方案2】:

该库在 linux 上运行良好,但在 windows 上运行良好。 在 Windows 上,我使用 https://code.google.com/p/libredic/

【讨论】:

    猜你喜欢
    • 2021-01-14
    • 2012-10-14
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多