获得在C++解决方案中工作的信誉

Cae*_*sar 1 c c++ window visual-studio-2010 redis

我正在开发一个C++项目,我必须连接到redis数据库.我试图让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 *'
Run Code Online (Sandbox Code Playgroud)

错误在第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 */
Run Code Online (Sandbox Code Playgroud)

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

我正在使用visual studio 2010来编译它,程序必须在窗口上运行.

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

cda*_*rke 6

您至少缺少一个头文件:

#include <fcntl.h>
Run Code Online (Sandbox Code Playgroud)

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

EINPROGRESS定义如下:

#include <errno.h>
Run Code Online (Sandbox Code Playgroud)

为了将来参考,E前缀通常意味着它是一个错误宏,所以errno.h首先要看.

'function' : incompatible types - from 'int *' to 'char *'可能意味着你有一个原型不匹配.您的原型与功能本身不匹配.更新原型.

编辑:虽然这将解决您的一些问题,但似乎这是UNIX代码(请参阅注释). F_GETFL并且F_SETFL,例如,似乎没有要在Windows支持. O_NONBLOCK是在unistd.hUNIX上.

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

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

例:

int iRetn = ioctlsocket(s, FIONBIO, 1);
Run Code Online (Sandbox Code Playgroud)

在哪里s是套接字,第三个参数是0表示阻塞,非零表示非阻塞.

您还需要#include <winsock.h>和调用WSAStartup()使用任何socket例程之前,并呼吁WSACleanup()在年底.

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