【问题标题】:Understanding second argument in the function "xdrmem_create"了解函数“xdrmem_create”中的第二个参数
【发布时间】:2014-09-22 19:32:52
【问题描述】:

我正在调试ganglia,并通过 UDP 通道使用 XDR 发送数据。 我发现函数xdrmem_create ( xdrs, addr, size, op) 的第二个参数很奇怪。 其中参数的语法如下:

XDR *xdrs;
char *addr;
u_int size;
enum xdr_op op;

这个函数的引用是here

如你所见,这个函数的第二个参数(xdrs)是一个字符数组。这同样在神经节的函数之一中声明为char msgbuf[GANGLIA_MAX_MESSAGE_LEN];

在 ganglia 中以 xdrmem_create(&x, msgbuf, GANGLIA_MAX_MESSAGE_LEN, XDR_ENCODE); 调用上述函数后,通过调用函数 xdr_Ganglia_value_msg(&x, &(cb->msg)) 将 ganglia 特定结构 (cb->msg) 中的适当数据编码为 XDR 格式,其中 xXDR 类型的变量.

稍后,为了通过UDP通道发送编码数据,函数Ganglia_udp_send_message( udp_send_channels, msgbuf, len);被调用。 为了了解这个 XDR 数据是如何发送的,我尝试使用 fprintf 打印 msgbuf 的内容的输出,但它总是不打印任何内容,尽管它是一个字符数组。而且编码数据发送成功也是很明显的。

所以,我的问题是,编码成 XDR 格式的数据是如何通过 UDP 通道发送的?

我粘贴了来自 ganglia here 的部分代码。从131到136行可以看到,供大家参考。

【问题讨论】:

  • 这个字符数组是否包含0字节?
  • 我曾尝试使用strlen() 打印msgbuf 的长度,但它总是返回零。而sizeof() 返回 8。

标签: c udp ganglia xdr


【解决方案1】:

消息使用 XDR(一种二进制格式)进行编码。使用的 XDR 库很旧,API 的现代版本可能会使用 uint8_t 而不是 char。尽管它使用 char,但它是二进制数据 - 即您不能将数据打印为字符串。

如果要打印此数据,请使用循环将每个字节打印为十六进制,例如通过printf("%02X ", msgbuf[i]);

阅读RFC4506 了解 XDR 编码。实际消息在 XDR 语言规范中描述,并通过代码生成工具(例如 C 代码的 rpcgen)运行以生成用于编码/解码的代码。 Ganglia 定义的消息定义见https://github.com/fastly/ganglia/blob/master/lib/gm_protocol.x

【讨论】:

  • 谢谢@nos。这是有道理的。 :)
猜你喜欢
  • 2021-04-02
  • 1970-01-01
  • 2020-12-17
  • 2021-12-20
  • 2013-10-27
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多