greeter_callback_client.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2021 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 #include <condition_variable>
20 #include <iostream>
21 #include <memory>
22 #include <mutex>
23 #include <string>
24 
25 #include <grpcpp/grpcpp.h>
26 
27 #ifdef BAZEL_BUILD
28 #include "examples/protos/helloworld.grpc.pb.h"
29 #else
30 #include "helloworld.grpc.pb.h"
31 #endif
32 
33 using grpc::Channel;
35 using grpc::Status;
39 
40 class GreeterClient {
41  public:
42  GreeterClient(std::shared_ptr<Channel> channel)
43  : stub_(Greeter::NewStub(channel)) {}
44 
45  // Assembles the client's payload, sends it and presents the response back
46  // from the server.
48  // Data we are sending to the server.
50  request.set_name(user);
51 
52  // Container for the data we expect from the server.
53  HelloReply reply;
54 
55  // Context for the client. It could be used to convey extra information to
56  // the server and/or tweak certain RPC behaviors.
58 
59  // The actual RPC.
60  std::mutex mu;
61  std::condition_variable cv;
62  bool done = false;
63  Status status;
64  stub_->async()->SayHello(&context, &request, &reply,
65  [&mu, &cv, &done, &status](Status s) {
66  status = std::move(s);
67  std::lock_guard<std::mutex> lock(mu);
68  done = true;
69  cv.notify_one();
70  });
71 
72  std::unique_lock<std::mutex> lock(mu);
73  while (!done) {
74  cv.wait(lock);
75  }
76 
77  // Act upon its status.
78  if (status.ok()) {
79  return reply.message();
80  } else {
81  std::cout << status.error_code() << ": " << status.error_message()
82  << std::endl;
83  return "RPC failed";
84  }
85  }
86 
87  private:
88  std::unique_ptr<Greeter::Stub> stub_;
89 };
90 
91 int main(int argc, char** argv) {
92  // Instantiate the client. It requires a channel, out of which the actual RPCs
93  // are created. This channel models a connection to an endpoint specified by
94  // the argument "--target=" which is the only expected argument.
95  // We indicate that the channel isn't authenticated (use of
96  // InsecureChannelCredentials()).
97  std::string target_str;
98  std::string arg_str("--target");
99  if (argc > 1) {
100  std::string arg_val = argv[1];
101  size_t start_pos = arg_val.find(arg_str);
102  if (start_pos != std::string::npos) {
103  start_pos += arg_str.size();
104  if (arg_val[start_pos] == '=') {
105  target_str = arg_val.substr(start_pos + 1);
106  } else {
107  std::cout << "The only correct argument syntax is --target="
108  << std::endl;
109  return 0;
110  }
111  } else {
112  std::cout << "The only acceptable argument is --target=" << std::endl;
113  return 0;
114  }
115  } else {
116  target_str = "localhost:50051";
117  }
118  GreeterClient greeter(
120  std::string user("world");
121  std::string reply = greeter.SayHello(user);
122  std::cout << "Greeter received: " << reply << std::endl;
123 
124  return 0;
125 }
mutex
static uv_mutex_t mutex
Definition: threadpool.c:34
benchmark.request
request
Definition: benchmark.py:77
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
hellostreamingworld_pb2.HelloRequest
HelloRequest
Definition: hellostreamingworld_pb2.py:102
status
absl::Status status
Definition: rls.cc:251
framework.rpc.grpc_channelz.Channel
Channel
Definition: grpc_channelz.py:32
channel
wrapped_grpc_channel * channel
Definition: src/php/ext/grpc/call.h:33
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
main
int main(int argc, char **argv)
Definition: greeter_callback_client.cc:91
mu
Mutex mu
Definition: server_config_selector_filter.cc:74
done
struct tab * done
Definition: bloaty/third_party/zlib/examples/enough.c:176
grpcpp.h
GreeterClient
Definition: grpc-helloworld.cc:73
GreeterClient::GreeterClient
GreeterClient(std::shared_ptr< Channel > channel)
Definition: greeter_callback_client.cc:42
helloworld.Greeter
Definition: helloworld.py:32
grpc::CreateChannel
std::shared_ptr< Channel > CreateChannel(const grpc::string &target, const std::shared_ptr< ChannelCredentials > &creds)
grpc::ClientContext
Definition: grpcpp/impl/codegen/client_context.h:195
hellostreamingworld_pb2.HelloReply
HelloReply
Definition: hellostreamingworld_pb2.py:109
cv
unsigned cv
Definition: cxa_demangle.cpp:4908
GreeterClient::SayHello
std::string SayHello(const std::string &user)
Definition: greeter_callback_client.cc:47
grpc::protobuf::util::Status
GRPC_CUSTOM_UTIL_STATUS Status
Definition: include/grpcpp/impl/codegen/config_protobuf.h:93
grpc::Status
Definition: include/grpcpp/impl/codegen/status.h:35
absl::Status::ok
ABSL_MUST_USE_RESULT bool ok() const
Definition: third_party/abseil-cpp/absl/status/status.h:802
context
grpc::ClientContext context
Definition: istio_echo_server_lib.cc:61
grpc::InsecureChannelCredentials
std::shared_ptr< ChannelCredentials > InsecureChannelCredentials()
Credentials for an unencrypted, unauthenticated channel.
Definition: cpp/client/insecure_credentials.cc:69
GreeterClient::stub_
std::unique_ptr< Greeter::Stub > stub_
Definition: grpc-helloworld.cc:102


grpc
Author(s):
autogenerated on Thu Mar 13 2025 02:59:47