mongo_client()失败,错误为MONGO_CONN_ADDR_FAIL

时间:2014-03-11 10:39:48

标签: c windows mongodb

我想在我的项目中使用mongodb c驱动程序,我在Windows 7上使用命令构建它:

  

scons --m32 --c99

我的问题是我无法使Connecting example工作:

#include <stdio.h>    

#define MONGO_HAVE_STDINT
#include "mongo.h"    

int main() {
  mongo conn[1];
  int status = mongo_client( conn, "127.0.0.1", 27017 );
  printf("status %d, err %d", status, conn->err);
  mongo_destroy( conn );
  return 0;
}

mongod是否在我的机器上运行,执行exe的输出是:

  

$ ./mongodb_example.exe   状态-1,错误3

错误3 corresponds到MONGO_CONN_ADDR_FAIL错误代码(调用getaddrinfo()时出错。)

有关如何成功连接的任何建议吗?

更新:

  • 版本为mongodb-mongo-c-driver-v0.8.1-0-g8f27c0f

3 个答案:

答案 0 :(得分:1)

如果您打印

,您可以了解mongo失败的确切原因
       conn->errcode
       conn->errstr

错误代码相当于linux中的errno或Windows中的GetLastError

errstr将包含与字符串相同的内容。所以你会看到像getaddrinfo failed with error <the return status of getaddrinfo>

这样的东西

getaddrinfo可能在您的系统中失败的原因有多种。您可以从手册页man gai_strerror获取这些值(errstr应报告此内容)

       EAI_AGAIN     temporary failure in name resolution
       EAI_BADFLAGS  invalid value for ai_flags
       EAI_BADHINTS  invalid value for hints
       EAI_FAIL      non-recoverable failure in name resolution
       EAI_FAMILY    ai_family not supported
       EAI_MEMORY    memory allocation failure
       EAI_NONAME    hostname or servname not provided, or not known
       EAI_OVERFLOW  argument buffer overflow
       EAI_PROTOCOL  resolved protocol is unknown
       EAI_SERVICE   servname not supported for ai_socktype
       EAI_SOCKTYPE  ai_socktype not supported
       EAI_SYSTEM    system error returned in errno

答案 1 :(得分:1)

因此,要完成这项工作,您需要做两件事:

  • 使用scons构建时,您需要确保启用&#34; standard-env&#34;目标如此:
  

scons --m32 --standard-env

  • 其次在您的代码中以及您已有的MONGO_HAVE_STDINT之外,请确保在建立连接之前致电mongo_init_sockets()。这在Windows上是必需的。
 #include <stdio.h>

 #define MONGO_HAVE_STDINT
 #include "mongo.h"

 int main() {
     mongo_init_sockets();
     mongo conn[1];

     int status = mongo_client( conn, "192.168.2.7", 27017 );
     printf("status %d, err %d", status, conn->err);
     mongo_destroy( conn );
     return 0;
 }

所以第一部分用getaddrinfo()解决了问题,&#34;标准环境&#34;中包含了一个实现。第二部分是必要的&#34; winsock&#34; Windows平台上需要的初始化。在测试文件中,这是使用定义的宏实现的。

还要确保您使用的是Python 2.7 32位(非64位)。不太确定当前scons版本的有效性,但确定不会有任何损害。

有些内容存在于您可能错过的文档中here,以及API文档中对mongo_init_sockets()函数的相当简单的描述。当然,查看发行版中的测试文件并没有受到伤害。

对我来说有点痛苦,因为我通常不在Windows上构建C程序。

答案 2 :(得分:0)

我还没有使用mongodb c驱动程序,所以这只是猜测。从教程中,您似乎跳过了初始化步骤:

http://api.mongodb.org/c/current/tutorial.html

mongo conn[1];
mongo_init( conn );
...
mongo_client( conn, "127.0.0.1", 27017 );