#include "sysproc.grpc.pb.h" #include #include #include #include extern"C" { #include }using grpc::Server; using grpc::ServerBuilder; using grpc::ServerContext; using grpc::Status;// Logic and data behind the server&#39;s behavior. class SysProcServiceImpl final : public SysProcManager::Service {Status getSysProc(ServerContext* context, const NullMessage* request,SysProc * reply) override {int memFree &#61; 0;struct sysinfo info;sysinfo(&info);memFree &#61; (int)(info.freeram);reply->set_memfree(memFree);return Status::OK;} };void RunServer() {std::string server_address("0.0.0.0:50051");SysProcServiceImpl service;ServerBuilder builder;// Listen on the given address without any authentication mechanism.builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());// Register "service" as the instance through which we&#39;ll communicate with// clients. In this case it corresponds to an *synchronous* service.builder.RegisterService(&service);// Finally assemble the server.std::unique_ptr server(builder.BuildAndStart());std::cout <<"Server listening on " <std::endl;// Wait for the server to shutdown. Note that some other thread must be// responsible for shutting down the server for this call to ever return.server->Wait(); }int main(int argc, char** argv) {RunServer();return0; }
#include #include #include #include #include "sysproc.grpc.pb.h"using grpc::Channel; using grpc::ClientContext; using grpc::Status;class SysProcClient {public://创建客户端类&#xff0c;该类通过一个SysProcManager&#xff08;protobuf定义的Service&#xff09;的stub来和服务器端进行通信SysProcClient(std::shared_ptr channel): stub_(SysProcManager::NewStub(channel)) {}// Assembles the client&#39;s payload, sends it and presents the response back// from the server.int getSysProc() {// Data we are sending to the server.NullMessage request;// Container for the data we expect from the server.SysProc reply;// Context for the client. It could be used to convey extra information to// the server and/or tweak certain RPC behaviors.ClientContext context;// The actual RPC.//stub调用生成的接口调用serviceStatus status &#61; stub_->getSysProc(&context, request, &reply);// Act upon its status.if (status.ok()) {return reply.memfree();} else {std::cout <": " <std::endl;return -1;}}private:std::unique_ptr stub_; };int main(int argc, char** argv) {// Instantiate the client. It requires a channel, out of which the actual RPCs// are created. This channel models a connection to an endpoint (in this case,// localhost at port 50051). We indicate that the channel isn&#39;t authenticated// (use of InsecureChannelCredentials()).//创建一个chanel用于定义一个和服务器端的网络连接&#xff0c;传给client的stubSysProcClient sysproc_client(grpc::CreateChannel("localhost:50051", grpc::InsecureChannelCredentials()));int reply &#61; sysproc_client.getSysProc();std::cout <<"Client received: " <std::endl;return0; }
Makefile:
HOST_SYSTEM &#61; $(shell uname | cut -f 1 -d_) SYSTEM ?&#61; $(HOST_SYSTEM) CXX &#61; g&#43;&#43; CPPFLAGS &#43;&#61; &#96;pkg-config --cflags protobuf grpc&#96; CXXFLAGS &#43;&#61; -std&#61;c&#43;&#43;11 ifeq ($(SYSTEM),Darwin) LDFLAGS &#43;&#61; -L/usr/local/lib &#96;pkg-config --libs protobuf grpc&#43;&#43; grpc&#96;\-lgrpc&#43;&#43;_reflection\-ldl else LDFLAGS &#43;&#61; -L/usr/local/lib &#96;pkg-config --libs protobuf grpc&#43;&#43; grpc&#96;\-Wl,--no-as-needed -lgrpc&#43;&#43;_reflection -Wl,--as-needed\-ldl endif PROTOC &#61; protoc GRPC_CPP_PLUGIN &#61; grpc_cpp_plugin GRPC_CPP_PLUGIN_PATH ?&#61; &#96;which $(GRPC_CPP_PLUGIN)&#96;PROTOS_PATH &#61; ../../protosvpath %.proto $(PROTOS_PATH)all: system-check sysproc_client sysproc_serversysproc_client: sysproc.pb.o sysproc.grpc.pb.o sysproc_client.o$(CXX) $^$(LDFLAGS) -o $&#64;sysproc_server: sysproc.pb.o sysproc.grpc.pb.o sysproc_server.o$(CXX) $^$(LDFLAGS) -o $&#64;.PRECIOUS: %.grpc.pb.cc %.grpc.pb.cc: %.proto$(PROTOC) -I$(PROTOS_PATH) --grpc_out&#61;. --plugin&#61;protoc-gen-grpc&#61;$(GRPC_CPP_PLUGIN_PATH) $<.PRECIOUS: %.pb.cc %.pb.cc: %.proto$(PROTOC) -I$(PROTOS_PATH) --cpp_out&#61;. $<clean:rm -f *.o *.pb.cc *.pb.h sysproc_client sysproc_server# The following is to test your system and ensure a smoother experience. # They are by no means necessary to actually compile a grpc-enabled software.PROTOC_CMD &#61; which $(PROTOC) PROTOC_CHECK_CMD &#61; $(PROTOC) --version | grep -q libprotoc.3 PLUGIN_CHECK_CMD &#61; which $(GRPC_CPP_PLUGIN) HAS_PROTOC &#61; $(shell $(PROTOC_CMD) > /dev/null && echo true || echo false) ifeq ($(HAS_PROTOC),true) HAS_VALID_PROTOC &#61; $(shell $(PROTOC_CHECK_CMD) 2> /dev/null && echo true || echo false) endif HAS_PLUGIN &#61; $(shell $(PLUGIN_CHECK_CMD) > /dev/null && echo true || echo false)SYSTEM_OK &#61; false ifeq ($(HAS_VALID_PROTOC),true) ifeq ($(HAS_PLUGIN),true) SYSTEM_OK &#61; true endif endifsystem-check: ifneq ($(HAS_VALID_PROTOC),true)&#64;echo" DEPENDENCY ERROR"&#64;echo&#64;echo"You don&#39;t have protoc 3.0.0 installed in your path."&#64;echo"Please install Google protocol buffers 3.0.0 and its compiler."&#64;echo"You can find it here:"&#64;echo&#64;echo" https://github.com/google/protobuf/releases/tag/v3.0.0"&#64;echo&#64;echo"Here is what I get when trying to evaluate your version of protoc:"&#64;echo-$(PROTOC) --version&#64;echo&#64;echo endif ifneq ($(HAS_PLUGIN),true)&#64;echo" DEPENDENCY ERROR"&#64;echo&#64;echo"You don&#39;t have the grpc c&#43;&#43; protobuf plugin installed in your path."&#64;echo"Please install grpc. You can find it here:"&#64;echo&#64;echo" https://github.com/grpc/grpc"&#64;echo&#64;echo"Here is what I get when trying to detect if you have the plugin:"&#64;echo-which $(GRPC_CPP_PLUGIN)&#64;echo&#64;echo endif ifneq ($(SYSTEM_OK),true)&#64;false endif