Hey Sree thank you for sharing.

Can you please check this 
out: https://groups.google.com/g/grpc-io/c/3LMvM62SAo0 

Thank you in advance!

В 7:07:51 UTC+2на сряда, 25 януари 2017 г. Sree Kuchibhotla написа:

> Hi,
> You are incorrectly using the async streaming API on the server side. 
>
> In the following code, stream_.Read(),  stream_.Write() and stream_.Finish() 
> are three *Async* calls -and would return immediately. You should have 
> done a cq_.Next() after each call to make sure the async operations 
> actually completed.
>
> ---
>        std::string prefix("Hello ");
>         stream_.Read(&request_, this);
>
>        //*** SREE: You should wait for cq_.Next() to return the tag (i.e 
> 'this') before proceeding ***
>       // It is not safe to proceed without that
>
>         std::cout << "Greeter server received: " << request_.message() << 
> std::endl;
>         reply_.set_message(prefix + request_.message());
>         std::cout << "Greeter server replied: " << reply_.message() << 
> std::endl;
>         stream_.Write(reply_, this); 
>
>        //*** SREE: You should wait for cq_.Next() to return the tag (i.e 
> 'this') before proceeding ***
>
>         // And we are done! Let the gRPC runtime know we've finished, 
> using the
>         // memory address of this instance as the uniquely identifying tag 
> for
>         // the event.
>         status_ = FINISH;
>         stream_.Finish(Status::OK, this);
> ---
>
> The correct way to do it is:
>
> 1) Expand your state-machine in CallData.  i.e change  enum CallStatus { 
> CREATE, PROCESS, FINISH }; 
> to enum CallStatus { CREATE, PROCESS, READ_CALLED, WRITE_CALLED, FINISH };
>
> 2) Change your Proceed() function to something like below:
>
> void Proceed() {
>    switch(status_) {
>      case CREATE: {
>
>         service_->RequestSayHello(&ctx_, &stream_, cq_, cq_, this);
>         status_ = PROCESS;
>         break;
>       } 
>      case PROCESS: {
>         new CallData(service_, cq_);
>
>
>         std::string prefix("Hello ");
>         stream_.Read(&request_, this);
>         status_ = READ_CALLED;
>         break;
>       }
>       case READ_CALLED: {
>         std::cout << "Greeter server received: " << request_.message() << 
> std::endl;
>         reply_.set_message(prefix + request_.message());
>         std::cout << "Greeter server replied: " << reply_.message() << 
> std::endl;
>         stream_.Write(reply_, this);
>   
>         status_ = WRITE_CALLED;
>         break;
>       }
>       case WRITE_CALLED: {
>         stream_.Finish(Status::OK, this);
>         status_ = FINISH;
>         break;
>       }
>       case FINISH: {
>         delete this;
>       }
>     }
>
>
> Hope this helps,
>
> thanks,
> Sree
>
>
>
> On Tue, Jan 24, 2017 at 8:44 PM, <[email protected]> wrote:
>
>> Mt client side uses sync API, as shown below.
>>
>> class GreeterClient {
>>  public:
>>   GreeterClient(std::shared_ptr<Channel> channel)
>>       : stub_(Greeter::NewStub(channel)) {}
>>
>>   // Assambles the client's payload, sends it and presents the response 
>> back
>>   // from the server.
>>   std::string SayHello(const std::string& user) {
>>     // Data we are sending to the server.
>>     HelloMessage request;
>>     request.set_message(user);
>>
>>     // Container for the data we expect from the server.
>>     HelloMessage reply;
>>
>>     // Context for the client. It could be used to convey extra 
>> information to
>>     // the server and/or tweak certain RPC behaviors.
>>     ClientContext context;
>>     std::shared_ptr<ClientReaderWriter<HelloMessage, HelloMessage> > 
>> stream(stub_->SayHello(&context));
>>
>>     // The actual RPC.
>>     stream->Write(request);
>>     stream->Read(&reply);
>>     return reply.message();
>>   }
>>
>>  private:
>>   std::unique_ptr<Greeter::Stub> 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't 
>> authenticated
>>   // (use of InsecureChannelCredentials()).
>>   GreeterClient greeter(grpc::CreateChannel(
>>       "localhost:50051", grpc::InsecureChannelCredentials()));
>>   std::string user("world");
>>   std::string reply = greeter.SayHello(user);
>>   std::cout << "Greeter received: " << reply << std::endl;
>>
>>   return 0;
>> }
>>
>>
>> Vijay Pai於 2017年1月24日星期二 UTC-8下午8時25分33秒寫道:
>>>
>>> What does your Client code look like?
>>>
>>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "grpc.io" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected].
>> To post to this group, send email to [email protected].
>> Visit this group at https://groups.google.com/group/grpc-io.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/grpc-io/808939a7-9335-4194-82af-4e92fadf04e9%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/grpc-io/808939a7-9335-4194-82af-4e92fadf04e9%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/a63983f3-6028-498d-8fca-2f31e64df482n%40googlegroups.com.

Reply via email to