You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@qpid.apache.org by Francesco Raviglione <fr...@gmail.com> on 2020/02/05 14:25:06 UTC

Qpid Proton C API, how can I receive binary data? What is the purpose of pn_inspect()?

Dear all,
I am writing you because I'm working with the C Qpid Proton library.
In particular, I'm using as reference the "C API reference", available
here:
https://qpid.apache.org/releases/qpid-proton-0.30.0/proton/c/api/files.html

I'm able to successfully send AMQP messages carrying binary data, which is
encapsulated by means of:
message_body=pn_message_body(message);
pn_data_put_binary(message_body,pn_bytes(my_msg_size,(const char *)
&my_msg));

I can see that the messages are successfully sent.

However, I'm having some difficulties in understanding how the receiving
mechanism works.
In the receive.c example (
https://qpid.apache.org/releases/qpid-proton-0.30.0/proton/c/api/receive_8c-example.html)
I noticed that the "decode_message()" function is called, passing a byte
buffer as the only argument, which is in turn calling "pn_inspect()", which
unfortunately is not documented.
What is the purpose of calling this function?

Moreover, I tried receiving the data by using:




















*.....pn_message_t *amqp_message;pn_bytes_t amqp_bytes;char
*amqp_message_buffer;amqp_message=pn_message();rx_size=pn_delivery_pending(d);amqp_message_buffer=malloc(rx_size*sizeof(char));if(!amqp_message_buffer)
{  fprintf(stderr,"Cannot receive message. Memory error.\n");  return
-1;}pn_link_recv(lnk,amqp_message_buffer,rx_size);if(!pn_delivery_partial(d)
&& !pn_delivery_aborted(d)) {
pn_message_decode(amqp_message,amqp_message_buffer,rx_size);
amqp_bytes=pn_data_get_binary(pn_message_body(amqp_message));  .....*

But "amqp_bytes.size" is always 0 and I cannot read any binary data.

Am I doing something wrong?
Is there a way in which I can efficiently receive a message through
"pn_link_recv()", get the corresponding "pn_data_t" message body and then
do "pn_data_get_binary()" to extract exactly the message I sent?

Thank you very much in advance!

Re: Qpid Proton C API, how can I receive binary data? What is the purpose of pn_inspect()?

Posted by Francesco Raviglione <fr...@gmail.com>.
Sorry, the code in the previous message was very badly formatted.

The right code should be the following one:

.....
pn_message_t *amqp_message;
pn_bytes_t amqp_bytes;
char *amqp_message_buffer;

amqp_message=pn_message();

rx_size=pn_delivery_pending(d);

amqp_message_buffer=malloc(rx_size*sizeof(char));
if(!amqp_message_buffer) {
  fprintf(stderr,"Cannot receive message. Memory error.\n");
  return -1;
}

pn_link_recv(lnk,amqp_message_buffer,rx_size);
if(!pn_delivery_partial(d) && !pn_delivery_aborted(d)) {
  pn_message_decode(amqp_message,amqp_message_buffer,rx_size);
  amqp_bytes=pn_data_get_binary(pn_message_body(amqp_message));
  .....

Thanks!


Il giorno mer 5 feb 2020 alle ore 15:25 Francesco Raviglione <
francescorav.es483@gmail.com> ha scritto:

> Dear all,
> I am writing you because I'm working with the C Qpid Proton library.
> In particular, I'm using as reference the "C API reference", available
> here:
> https://qpid.apache.org/releases/qpid-proton-0.30.0/proton/c/api/files.html
>
> I'm able to successfully send AMQP messages carrying binary data, which is
> encapsulated by means of:
> message_body=pn_message_body(message);
> pn_data_put_binary(message_body,pn_bytes(my_msg_size,(const char *)
> &my_msg));
>
> I can see that the messages are successfully sent.
>
> However, I'm having some difficulties in understanding how the receiving
> mechanism works.
> In the receive.c example (
> https://qpid.apache.org/releases/qpid-proton-0.30.0/proton/c/api/receive_8c-example.html)
> I noticed that the "decode_message()" function is called, passing a byte
> buffer as the only argument, which is in turn calling "pn_inspect()", which
> unfortunately is not documented.
> What is the purpose of calling this function?
>
> Moreover, I tried receiving the data by using:
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> *.....pn_message_t *amqp_message;pn_bytes_t amqp_bytes;char
> *amqp_message_buffer;amqp_message=pn_message();rx_size=pn_delivery_pending(d);amqp_message_buffer=malloc(rx_size*sizeof(char));if(!amqp_message_buffer)
> {  fprintf(stderr,"Cannot receive message. Memory error.\n");  return
> -1;}pn_link_recv(lnk,amqp_message_buffer,rx_size);if(!pn_delivery_partial(d)
> && !pn_delivery_aborted(d)) {
> pn_message_decode(amqp_message,amqp_message_buffer,rx_size);
> amqp_bytes=pn_data_get_binary(pn_message_body(amqp_message));  .....*
>
> But "amqp_bytes.size" is always 0 and I cannot read any binary data.
>
> Am I doing something wrong?
> Is there a way in which I can efficiently receive a message through
> "pn_link_recv()", get the corresponding "pn_data_t" message body and then
> do "pn_data_get_binary()" to extract exactly the message I sent?
>
> Thank you very much in advance!
>