In order to receive events the from a Storyboard application, a client program
                    must first create a receive communication channel using the
                        gre_io_open() function. This function takes the name of a
                    channel to create and the mode in which to open the channel, for reading or
                    writing. Receiving clients must open it for reading.
Once the communication channel is created, then the client program then must
                    call gre_io_receive() in order to receive and process
                    events.
The client communication channel can be created in either a blocking or
                    non-blocking mode.   By default the gre_io_receive() function will
                    not return unless there is an event available or an error has occurred.
Once an event has been received the data can be unserialized into its standard
                    components using the gre_io_unserialze() function.
char    *name = (char *)arg;
gre_io_t *rhandle;
gre_io_serialized_data_t *buffer = NULL;
int ret;
char *revent_name;
char *revent_target;
char *revent_format;
uint8_t *revent_data;
int offset, i, rnbytes;
rhandle = gre_io_open(name, GRE_IO_TYPE_RDONLY);
if(rhandle == NULL) {
    printf("Can't open IO channel %s\n", name);
    return 0;
}
printf("Waiting on channel [%s]\n", name);
while(1) {
    ret = gre_io_receive(rhandle, &buffer);
    if(ret < 0) {
        printf("Problem receiving data on channel [%s]\n", name);
        break;
    }
     rnbytes = gre_io_unserialize(buffer,
                            &revent_target,
                            &revent_name,
                            &revent_format,
                            (void **)&revent_data);
     printf("Event Received [%s] on channel [%s]:\n", revent_name, name);
     printf(" Event Target: [%s]\n", revent_target);    
     printf(" Event Format: [%s]\n", revent_format);    
     printf(" Event Data (%d bytes):\n", rnbytes);    
}
gre_io_close(rhandle);