2014-09-22 2 views
0

Я отлаживал ganglia и отправлял данные с использованием XDR через канал UDP. Я нашел второй аргумент функции xdrmem_create (xdrs, addr, size, op) странным. Если синтаксис аргументов определяется как:Понимание второго аргумента в функции «xdrmem_create»

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

Упоминание этой функции here.

Как вы можете видеть, вторым аргументом (xdrs) этой функции является массив символов. И это аналогично объявлено в одной из функций ганглии как char msgbuf[GANGLIA_MAX_MESSAGE_LEN];.

После вызова функции как выше xdrmem_create(&x, msgbuf, GANGLIA_MAX_MESSAGE_LEN, XDR_ENCODE); в ганглиях, соответствующие данные в определенной структуре ганглиев (в cb->msg) кодируются в формат XDR путем вызова функции xdr_Ganglia_value_msg(&x, &(cb->msg)), где x является XDR типа переменного.

Позже, чтобы отправить закодированные данные через канал UDP, вызывается функция Ganglia_udp_send_message(udp_send_channels, msgbuf, len);. Чтобы понять, как отправляются данные XDR, я попытался распечатать вывод содержимого msgbuf с использованием fprintf, но он всегда ничего не печатает, несмотря на то, что это массив символов. И также очевидно, что кодированные данные отправляются успешно.

Итак, мой вопрос: как данные, закодированные в формате XDR, отправляются через канал UDP здесь?

Я вставил часть кода из ганглиев here. Вы можете видеть из строки с 131 по 136 для справки.

+0

Имеет ли этот массив символов 0-байтов? – mafso

+0

Я попытался напечатать длину 'msgbuf', используя' strlen() ', и он всегда возвращал ноль. в то время как 'sizeof()' возвращает 8. – Rohit

ответ

1

Сообщения кодируются с помощью XDR, двоичного формата. Используемые библиотеки XDR являются старыми, и современная версия API, вероятно, использовала бы uint8_t вместо char. Несмотря на то, что он использует char, это двоичные данные - т. Е. Вы не можете печатать данные в виде строки.

Если вы хотите распечатать эти данные, используйте цикл, в котором вы печатаете каждый байт в виде шестнадцатеричного кода, например. от printf("%02X ", msgbuf[i]);

Прочтите RFC4506, чтобы узнать о кодировке XDR. Фактические сообщения описаны в спецификации языка XDR и проходят через инструмент генерации кода (например, rpcgen для кода C) для генерации кода для кодирования/декодирования. См. https://github.com/fastly/ganglia/blob/master/lib/gm_protocol.x для определений сообщений, определяемых Ganglia.

+0

Спасибо @nos. Это имеет смысл. :) – Rohit