MongoDB C++ Legacy 驱动程序 - 如何使用 UNIX 域套接字进行连接

Posted

技术标签:

【中文标题】MongoDB C++ Legacy 驱动程序 - 如何使用 UNIX 域套接字进行连接【英文标题】:MongoDB C++ Legacy driver - how to connect using UNIX domain socket 【发布时间】:2015-10-17 10:17:53 【问题描述】:

我尝试使用 UNIX 域套接字进行连接

mongo::DBClientConnection connection(true);
connection.connect("mongodb:///tmp/mongodb-27017.sock");

我有一个例外:

解析错误的数字“/” ///tmp/mongodb-27017.sock

也许有人知道如何使用 C++ 驱动程序来做到这一点?

更新

这正是我的代码

std::string errmsg;
mongo::ConnectionString cs = mongo::ConnectionString::parse("mongodb:///tmp/mongodb-27017.sock", errmsg);

if (!cs.isValid()) 
    std::cout << "Error parsing connection string " << uri << ": " << errmsg << std::endl;
    return;


std::shared_ptr<mongo::DBClientBase> conn(cs.connect(errmsg));
if (!conn) 
    std::cout << "couldn't connect : " << errmsg << std::endl;
    return;

我已经尝试了 1.0.6 和 1.0.5 版本,我的输出

无法连接:无法连接到服务器 /tmp/mongodb-27017.sock:27017 (/tmp/mongodb-27017.sock),连接 尝试失败

我像这样构建驱动程序:

$scons --prefix=$HOME/libs/mongo install

我的工作环境:

$ uname -a
Linux roman-nout 3.19.0-30-generic #34-Ubuntu SMP Fri Oct 2 22:08:41 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.9.2-10ubuntu13' --with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.9 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.9-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.9.2 (Ubuntu 4.9.2-10ubuntu13) 
$ ls /tmp/mongodb-27017.sock
/tmp/mongodb-27017.sock

我从这个页面下载了源代码https://github.com/mongodb/mongo-cxx-driver/releases/tag/legacy-1.0.5

【问题讨论】:

以后在贴代码的时候,请贴出只需要复制粘贴就可以编译的东西:int main()、headers等 我运行了你的程序。如果我用 mongod 启动它,它连接得很好。如果我在没有启动 mongod 的情况下运行它,则会出现上述错误。我认为问题在于错误消息具有误导性。你应该看看为什么它不能连接到你的 mongod。您实际上是否在监听 unix 域套接字的配置中启动了 mongod?您可以检查 lsof -p $(pgrep mongod) | grep unix 谢谢!我发现了一个邪恶的根源 - 文件 /tmp/mongodb-27017.sock 没有我的 Linux 用户读/写的权限。我已经使用 'chmod' 对其进行了更改,并且连接已成功建立。 【参考方案1】:

这不是创建连接的正确方法。使用 ConnectionString::parse 方法创建一个 ConnectionString 对象,然后对其调用 connect:

见https://github.com/mongodb/mongo-cxx-driver/blob/legacy/src/mongo/client/examples/insert_demo.cpp#L42-L52

这是构建和使用驱动程序通过 UNIX 域套接字进行连接的记录:

> git checkout legacy
Already on 'legacy'
Your branch is up-to-date with 'origin/legacy'.

> scons --cc=/usr/bin/clang --cxx=/usr/bin/clang++ --cache --dbg=on --sharedclient --ssl --use-sasl-client --extrapath=/usr/local -j10 check-install all install-examples
...
scons: `all' is up to date.
scons: `install-examples' is up to date.
scons: done building targets.

> build/install/share/mongo-cxx-driver/examples/insertDemo mongodb:///tmp/mongodb-27017.sock
dropping collection...
inserting...
getlasterror returns: ""
9 seconds 11111 per second

【讨论】:

谢谢,但现在在建立连接时出现下一个错误无法连接到服务器 /tmp/mongodb-27017.sock:27017 (/tmp/mongodb-27017.sock),连接尝试失败 看起来 C++ 驱动程序不支持 UNIX 域套接字,因为它不知道它不需要默认端口。 @Kastaneda 您使用的是什么版本的 C++ 驱动程序? @Kastaneda 那个版本还没有发布,虽然我们也在计划这周的某个时间。您可以发布一个新的代码示例来准确显示您在做什么吗?我刚刚在本地测试并使用 mongodb::// URI 很好地连接到 UNIX 域套接字。 可能我错了版本。我查看了 /include/mongo/version.h 并找到了这一行 const char kVersionString[] = "1.0.6-rc0-pre"; 我将很快发布我的代码。 @Kastaneda - 我明白了。在构建驱动程序时,您应该真正检查发布的标签(或从 github 项目发布页面下载一个发布 tarball)。遗留的 HEAD 可能不稳定,因为我们正在为下一个版本进行修复。

以上是关于MongoDB C++ Legacy 驱动程序 - 如何使用 UNIX 域套接字进行连接的主要内容,如果未能解决你的问题,请参考以下文章

就 mongoDb 而言,GeoJSON 和 Legacy 坐标对有啥区别?

C# .Net + MongoDB Atlas 连接字符串 MongoDB.Driver.Legacy 尝试运行客户端时出错

对于 GNU ld 'legacy __sync_synchronize' 警告,我能做些啥?

如何在启动 C++ 应用程序时检查 mongodb 是不是正在运行

使用新的 MongoDB C++ 驱动程序创建索引

linux下mongodb程序和c++客户端的编译