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来编译它,程序必须在窗口上运行.
我试图用这个建议的答案批处理代码,但这没有帮助.
您至少缺少一个头文件:
#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()在年底.
(说实话,这就是我现在所能想到的,我没有意识到我会回答套接字上的问题).
| 归档时间: |
|
| 查看次数: |
3455 次 |
| 最近记录: |