获取从grpc客户端传输的二进制数据

时间:2019-03-06 04:45:10

标签: c++ server client-server wireshark grpc

我是gRPC框架的新手,并且已经在PC上创建了一个示例客户端服务器(请参考this)。

在我的客户端服务器应用程序中,我实现了 simple RPC

service NameStudent {
  rpc GetRoll(RollNo) returns (Details) {}
}

客户发送 RollNo ,并接收他/她的详细信息,包括姓名,年龄,性别,父母姓名和滚动编号。

message RollNo{
    int32 roll = 1;
}

message Details {
    string name = 1;
    string gender = 2;
    int32 age = 3;
    string parent = 4;
    RollNo rollid = 5;
}

实际的服务器和客户端代码是here解释的示例代码的改编

现在,我的服务器可以收听“ 0.0.0.0:50051(address:port)” ,并且客户端可以在“ localhost:50051”上发送胶卷编号并接收详细信息。

我想查看在客户端和服务器之间传输的实际二进制数据。我曾经尝试过使用Wireshark,但我不明白我在这里看到的内容。

这是 wireshark捕获的屏幕截图 Wireshark Screenshot

这是上面截图中突出显示的条目的详细信息。 Details

在这里需要帮助来理解Wireshark,或者可以使用其他任何方式来查看二进制数据。

2 个答案:

答案 0 :(得分:2)

Wireshark使用端口来确定如何解码通信,并且它不知道与50051相关的任何协议。因此,您需要对其进行配置以将其视为HTTP。

右键单击一行,然后在上下文菜单中选择“解码为...”。

About to click "Decode As" in context menu

然后将“当前”设置为“ HTTP”或“ HTTP2”(HTTP通常会自动检测HTTP2),然后单击“确定”。

After setting "HTTP" as the Content

然后应解码HTTP / 2帧。而且,如果使用最新版本的Wireshark,您可能还会看到gRPC帧已解码。

Decoding as HTTP/2

答案 1 :(得分:1)

grpc的整个想法就是隐藏这一点。假设我们忽略了这一点,而您知道自己在做什么。

反向工程师练习的两个很好的起点是:

  • 从简单开始:编译一个发送整数的程序。理解。闻一下然后编译一个发送字符串的程序。尝试几个值。一旦您了解了它,就可以解决了解Google如何发送您的结构的问题。

  • 使用已知数据并进行一些细微的变化:如果您开始知道要发送的数据,则知道505249 ...会更容易(例如,发送“ Hello world”字符串;然后将其更改为“海拉世界”;查看编码的嗅探有什么变化;还要检查几次发送相同数据会产生相同的嗅探输出)。应用优先点:从简单的字符串开始,然后是空字符串,然后是“”,然后是“ a”,然后是“ b”,依此类推,然后再传递给复杂且较大的字符串。不要害怕从简单开始。