2013-03-31 35 views
1

我正在開發一個C++項目,我必須連接到redis數據庫。我試圖讓credis代碼工作,但是當我編譯我得到這些套錯誤讓Credis在C++解決方案中工作

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建議的答案來批處理代碼,但這並沒有幫助。

+0

@Downvoter爲什麼?爲了讓這個問題更清楚,我需要編輯什麼? – Caesar

+0

什麼是靈魂? – jalf

+0

@jalf修好了,對不起。 – Caesar

回答

6

您有至少一個頭文件丟失:

#include <fcntl.h> 

應該解決您的一些問題。通常,查找頭文件名的好地方在函數本身的幫助文本中。在這種情況下,頭文件與函數具有相同的名稱(fcntl),但大多數並不那麼容易。

EINPROGRESS中定義:

#include <errno.h> 

以供將來參考,E前綴通常意味着它是一個錯誤的宏,所以errno.h是看首位。

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

編輯: 雖然這將解決您的一些問題,但看起來這是UNIX代碼(請參閱註釋)。例如,Windows上似乎不支持F_GETFLF_SETFLO_NONBLOCK在UNIX上爲unistd.h

您需要重寫需要此功能的代碼部分,或者更好地從供應商處獲取Windows版本。

從更新後的文章中,這些都是使用套接字完成的。套接字相當便攜,但有一些問題。對於非阻塞套接字,在Windows上使用ioctlsocket()

實施例:

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

其中s是插座,第三個參數是0用於阻斷,爲非阻塞非零。

在使用任何套接字例程之前,您還需要使用#include <winsock.h>並調用WSAStartup(),並在最後調用WSACleanup()。 (說實話,這是我現在所能想到的,我沒有意識到我會回答套接字問題)。

+1

謝謝,這解決了一半的錯誤。 F_GETFL,F_SETFL,O_NONBLOCK仍然出錯,但其他人已經消失。 – Caesar

+0

「消失」是可怕的 – cdarke

+0

爲了澄清,'fcntl'和'EINPROGRESS1'「消失」一旦我包含這些文件。 – Caesar