lang110 发表于 2015-7-8 06:02:59

mongodb协议透传

  由于没时间搞mongodb透传,之前写mongodb的proxy程序时候都是用自带的驱动(mongoclient),然后自己定协议,让其他语言比如php、c++、java、C#去实现,然后做通讯,用了一段时间也没什么问题,但是总觉得很不完美,最近终于个人时间充裕一些,打开mongodb的源码,对应网上牛人的源码解析,开始实现mongodb的协议透传,无废话,上代码:



#include
#include
#include "mongo/util/net/message_port.h"
#include "mongo/util/net/message_server.h"
#include "DzhMessageServer.h"
#include "DzhMessageHandler.h"
using namespace std;
using namespace mongo;
int main(int argc, const char *argv[])
{
MessageServer::Options opts;
opts.port = 28686;
opts.ipList = "10.15.107.155";
DzhMessageHandler handler;      
DzhMessageServer svr(opts, &handler);   
svr.run();
return 0;
}
  
  这是proxy服务的代码入口,mongodb的服务端是基于boost::asio的,所以这段代码看着眼熟吧,DzhMessageServer 实现的是网络服务,DzhMessageHandler实现的是事件处理,MessageServer::Options.port是服务端口,MessageServer::Options.ipList是本机IP地址,代码清晰,一看就懂。



#pragma once
#include "mongo/util/net/message.h"
#include "mongo/util/net/message_port.h"
#include "mongo/util/net/message_server.h"
#include "mongo/util/net/listen.h"
#include "mongo/db/lasterror.h"
#include
using namespace mongo;
using namespace boost;
class DzhMessageServer:public MessageServer , public Listener
{
public:
DzhMessageServer(const MessageServer::Options& opts, MessageHandler* handler):
Listener("" , opts.ipList, opts.port),
m_handler(handler)
{
}
void HandleIncomingMsg(void* arg)
{
scoped_ptr himArg(static_cast(arg));
MessagingPort* inPort = himArg->inPort;
MessageHandler* handler = himArg->handler;
inPort->psock->setLogLevel(1);
scoped_ptr p( inPort );
string otherSide;
Message m;
try
{
LastError * le = new LastError();
lastError.reset( le ); // lastError now has ownership

otherSide = p->psock->remoteString();
handler->connected( p.get() );
while ( ! inShutdown() ) {
m.reset();
p->psock->clearCounters();
if ( ! p->recv(m) ) {
if( !cmdLine.quiet ){
int conns = 0;//Listener::globalTicketHolder.used()-1;
const char* word = (conns == 1 ? " connection" : " connections");
log()
页: [1]
查看完整版本: mongodb协议透传