85 lines
2.1 KiB
C++
Raw Normal View History

2024-03-08 14:03:37 +08:00
#include "examples/protobuf/resolver/resolver.pb.h"
#include "muduo/base/Logging.h"
#include "muduo/net/EventLoop.h"
#include "muduo/net/protorpc/RpcServer.h"
#include "examples/cdns/Resolver.h"
#include <unistd.h>
using namespace muduo;
using namespace muduo::net;
namespace resolver
{
class ResolverServiceImpl : public ResolverService
{
public:
ResolverServiceImpl(EventLoop* loop)
: resolver_(loop, cdns::Resolver::kDNSonly)
{
}
virtual void Resolve(::google::protobuf::RpcController* controller,
const ::resolver::ResolveRequest* request,
::resolver::ResolveResponse* response,
::google::protobuf::Closure* done)
{
LOG_INFO << "ResolverServiceImpl::Resolve " << request->address();
bool succeed = resolver_.resolve(request->address(),
std::bind(&ResolverServiceImpl::doneCallback,
this,
request->address(),
_1,
response,
done));
if (!succeed)
{
response->set_resolved(false);
done->Run();
}
}
private:
void doneCallback(const std::string& host,
const muduo::net::InetAddress& address,
::resolver::ResolveResponse* response,
::google::protobuf::Closure* done)
{
LOG_INFO << "ResolverServiceImpl::doneCallback " << host;
int32_t ip = address.ipNetEndian();
if (ip)
{
response->set_resolved(true);
response->add_ip(ip);
response->add_port(address.portNetEndian());
}
else
{
response->set_resolved(false);
}
done->Run();
}
cdns::Resolver resolver_;
};
} // namespace resolver
int main()
{
LOG_INFO << "pid = " << getpid();
EventLoop loop;
InetAddress listenAddr(2053);
resolver::ResolverServiceImpl impl(&loop);
RpcServer server(&loop, listenAddr);
server.registerService(&impl);
server.start();
loop.loop();
}