Thank you Sree! It is working now. I really appreciate your help. You guys 
are awesome!

Sree Kuchibhotla於 2017年1月24日星期二 UTC-8下午9時07分51秒寫道:
>
> 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
>
>

-- 
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/b1582036-1946-4707-8ef3-b49688e2cd18%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to