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.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を使用していますが、プログラムはウィンドウで実行する必要があります。

この提案された回答でコードをバッチ処理しようとしましたが、役に立ちませんでした。

4

2 に答える 2

6

少なくとも 1 つのヘッダー ファイルがありません:

#include <fcntl.h>

それはあなたの問題のいくつかを修正するはずです。通常、ヘッダー ファイル名を探すのに適した場所は、関数自体のヘルプ テキストです。この場合、ヘッダー ファイルは関数 ( ) と同じ名前になりますがfcntl、ほとんどはそれほど簡単ではありません。

EINPROGRESSで定義されています。

#include <errno.h>

今後の参考のために、Eプレフィックスは通常、それがエラー マクロであることを意味するためerrno.h、最初に確認する場所です。

'function' : incompatible types - from 'int *' to 'char *'おそらく、プロトタイプの不一致があることを意味します。プロトタイプが関数自体と一致しません。プロトタイプを更新します。

編集:これで問題の一部は修正されますが、これは UNIX コードのようです (コメントを参照)。 たとえば、Windows ではサポートされていないようです F_GETFL。はUNIX 上にあります。F_SETFLO_NONBLOCKunistd.h

この機能を必要とするコードの部分を書き直すか、サプライヤーから Windows バージョンを入手することをお勧めします。

更新された投稿から、これらはソケットを使用して行われます。ソケットはかなり移植性がありますが、いくつかの問題があります。ioctlsocket()Windowsでノンブロッキング ソケットを使用する場合。

例:

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

sソケットです。3 番目のパラメーターは、ブロックの場合は 0、非ブロックの場合はゼロ以外です。

また、ソケットルーチンを使用する前に#include <winsock.h>呼び出す必要があり、最後に呼び出す必要があります。 WSAStartup()WSACleanup()

(正直に言うと、今思いつくのはこれだけです。ソケットに関する問題に答えるとは思いませんでした)。

于 2013-03-31T13:01:26.050 に答える