1

我正在开发一个必须连接到 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.c728 行到第 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 来编译它,并且程序必须在窗口上运行。

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

4

2 回答 2

6

您至少缺少一个头文件:

#include <fcntl.h>

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

EINPROGRESS定义在:

#include <errno.h>

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

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

编辑:虽然这将解决您的一些问题,但似乎这是 UNIX 代码(见评论)。 F_GETFLF_SETFL,例如,在 Windows 上似乎不受支持。 O_NONBLOCKunistd.hUNIX 上。

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

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

例子:

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

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

您还需要在使用任何套接字例程之前调用并#include <winsock.h>在结束时调用。 WSAStartup()WSACleanup()

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

于 2013-03-31T13:01:26.050 回答
2

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

于 2014-01-22T03:48:28.070 回答