2016-08-11 10 views
3

私は以下のようなことをやろうとしています(ストリーミングgrpc呼び出しを使用してクライアントからサーバーにデータを送信しています)。コードの参照は説明のための公式サイト上で与えられたgrpc例から取られる:C++のストリーミングgrpcコールにメタデータを追加する方法

クライアント側コード:

ClientContext context; 
context.AddMetadata("authorization", "abcd"); 
context.set_deadline(...); 

std::unique_ptr<ClientWriter<RequestObjectClass>> writer(stub_->grpcCall(&context, &response)); 
writer->WaitForInitialMetadata(); 

// Setting request parameters 
request.set...(...); 
request.set...(...); 
request.set...(...); 
request.set...(...); 

if (!writer->Write(request)) { 
    Status status = writer->Finish(); 
    if (status.error_code() == UNAUTHENTICATED) { 
     std::cout << "UNAUTHORIZED" << std::endl; 
     break; 
    } 

    // Broken stream. 
    throw Exception("Broken Stream"); 
} 

writer->WritesDone(); 
Status status = writer->Finish(); 
if (status.ok()) { 
    std::cout << "RPC succeeded." << std::endl; 
} else { 
    std::cout << "RPC failed." << std::endl; 
} 

サーバーサイドコード:

std::multimap<grpc::string_ref, grpc::string_ref> metadata = context->client_metadata(); 
auto auth = metadata.find("authorization"); 

if (auth == metadata.end()) { 
    return Status(StatusCode::UNAUTHENTICATED, "UNAUTHORIZED"); 
} 

私は「ブロークン・ストリーム」の例外を取得しますので、ステータスにはコード「DEADLINE_EXCEEDED」があり、詳細は「Deadline Exceeded」となっています。 ClientContextのデッドラインタイムアウトは、system_clock :: now()+ 5秒です。私は間違って何をしていますか?

答えて

0

"writer-> WaitForInitialMetadata();"という行を削除しました。それが働き始めた。私はこの行によってクライアントがサーバーからのメタデータを待つと思う。確かに。

関連する問題