Я отлаживал 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-байтов? – mafso
Я попытался напечатать длину 'msgbuf', используя' strlen() ', и он всегда возвращал ноль. в то время как 'sizeof()' возвращает 8. – Rohit