mq_stream_t *mq_stream_read_create(mq_context_t *mqc, mq_ongoing_t *on, char *host_id, int hid_len, mq_frame_t *fdata, mq_msg_t *remote_host, int to)
{
    mq_stream_t *mqs;
    int ptype;

    type_malloc_clear(mqs, mq_stream_t, 1);

    mqs->mqc = mqc;
    mqs->ongoing = on;
    mqs->type = MQS_READ;
    mqs->want_more = MQS_MORE;
    mqs->host_id = host_id;
    mqs->hid_len = hid_len;
    mqs->timeout = to;
    mqs->msid = atomic_global_counter();

    if (log_level() > 5) {
        char *str = mq_address_to_string(remote_host);
        log_printf(5, "remote_host=%s\n", str);
        if (str) free(str);
    }

    mq_get_frame(fdata, (void **)&(mqs->data), &(mqs->len));

    mqs->sid_len = mqs->data[MQS_HANDLE_SIZE_INDEX];
    type_malloc(mqs->stream_id, char, mqs->sid_len);
    memcpy(mqs->stream_id, &(mqs->data[MQS_HANDLE_INDEX]), mqs->sid_len);

    ptype = (mqs->data[MQS_PACK_INDEX] == MQS_PACK_COMPRESS) ? PACK_COMPRESS : PACK_NONE;
    log_printf(1, "msid=%d ptype=%d pack_type=%c\n", mqs->msid, ptype, mqs->data[MQS_PACK_INDEX]);
    mqs->pack = pack_create(ptype, PACK_READ, &(mqs->data[MQS_HEADER]), mqs->len - MQS_HEADER);

    log_printf(5, "data_len=%d more=%c MQS_HEADER=%d\n", mqs->len, mqs->data[MQS_STATE_INDEX], MQS_HEADER);

    unsigned char buffer[1024];
    int n = (50 > mqs->len) ? mqs->len : 50;
    log_printf(5, "printing 1st 50 bytes mqsbuf=%s\n", mq_id2str((char *)mqs->data, n, (char *)buffer, 1024));

    if (mqs->data[MQS_STATE_INDEX] == MQS_MORE) { //** More data coming so ask for it
        log_printf(5, "issuing read request\n");

        mqs->remote_host = mq_msg_new();
        mq_msg_append_msg(mqs->remote_host, remote_host, MQF_MSG_AUTO_FREE);

        if (log_level() >=15) {
            char *rhost = mq_address_to_string(mqs->remote_host);
            log_printf(15, "remote_host as string = %s\n", rhost);
            if (rhost) free(rhost);
        }

        log_printf(5, "before ongoing_inc\n");
        mq_ongoing_host_inc(mqs->ongoing, mqs->remote_host, mqs->host_id, mqs->hid_len, mqs->timeout);
        log_printf(5, "after ongoing_inc\n");
        mq_stream_read_request(mqs);
    }

    log_printf(5, "END\n");

    return(mqs);
}
Exemple #2
0
// wait for "timeout" milliseconds to receive a packet on socket "s"
pack_t* sock_receive( sock_t* s, int timeout, unsigned long long* wait_ts )
{
	int res_cs, res_ur;
	assert( s );

	timeout = timeout < 0 ? 0 : timeout;
	res_cs = SDLNet_CheckSockets( s->sset, timeout );	assert( res_cs != -1 );
	if( wait_ts )		*wait_ts = get_t();
	if( !res_cs )		return NULL;			// no_activity

	pack_t* pck = pack_create( NULL, -1 );
	res_ur = SDLNet_UDP_Recv( s->sock, pck->p );
	if( res_ur == -1 ){printf("[E] Error receiving UDP packet");pack_destroy(pck);return NULL;}
	if( res_ur ==  0 ){printf("[W] No UDP packet received on an active port");pack_destroy(pck);return NULL;}
	s->bytes_recv += pck->p->len;

	pck->type = streamer_rdint( pck->st );
	return pck;
}