C++ 如何使用gRPC在客户端和服务器之间双向发送和接收流元数据?

C++ 如何使用gRPC在客户端和服务器之间双向发送和接收流元数据?,c++,stream,protocol-buffers,grpc,C++,Stream,Protocol Buffers,Grpc,我想使用gRPC将文件从客户端传输到服务器,并将文件从服务器传输到客户端。但是,接收进程不知道需要多少字节。我曾经看到过这样的建议,即在传输的数据的开头附加这个,然后在从流中接收到第一个块时将其解析出来。但是,如果可能的话,我希望避免这种情况。在GRPC C++ API中,我看到clitWrror实现了CeleTraseIn接口,并使用WaIFFrimeIrimeMeta()访问服务器元数据。服务器实现ServerStreamingInterface,并可以使用SendInitialMetada

我想使用gRPC将文件从客户端传输到服务器,并将文件从服务器传输到客户端。但是,接收进程不知道需要多少字节。我曾经看到过这样的建议,即在传输的数据的开头附加这个,然后在从流中接收到第一个块时将其解析出来。但是,如果可能的话,我希望避免这种情况。在GRPC C++ API中,我看到clitWrror实现了CeleTraseIn接口,并使用WaIFFrimeIrimeMeta()访问服务器元数据。服务器实现ServerStreamingInterface,并可以使用SendInitialMetadata()方法发送服务器元数据

目前还不清楚此元数据由什么组成,以及如何添加自己的元数据,以便在发送之前通知客户端服务器期望的文件大小

<> P>此外,我不知道用GRPC C++ API通知服务器希望从哪个客户机得到什么大小的文件。 当然,我对GRPC和C++是新手,所以在正确的方向上的任何指针都会被大大理解。

< P>这里有一个参考:

这里有一个例子:

客户端和服务器都可以分别指定要在ClientContext和ServerContext上发送的初始元数据。该方法在ClientContext上称为AddMetadata,在ServerContext上称为AddInitialMetadata(以区别于尾随元数据):

在本例中,值是一个字符串。要指定数字,通常使用grpc::To_字符串:

    context->AddInitialMetadata("filesize", grpc::to_string(file_size));
接收方元数据的格式为

    const std::multimap< grpc::string_ref, grpc::string_ref > &
(如果不确定是否指定了“filesize”,则可能需要检查metadata.find(“filesize”)!=metadata.end()

至于如何发送初始元数据,当您在线路上发送RPC时,它将在客户端自动发送。在服务器端,您可以使用SendInitialMetadata()显式发送它,也可以在流上进行第一次服务器写入时发送它

    const std::multimap< grpc::string_ref, grpc::string_ref > &
    int filesize = atoi(metadata.find("filesize")->second);