Example #1
0
/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  int recv_chirp()
 *  Description:  
 * =====================================================================================
 */
int recv_chirp(int sd, Udp_Probe_Pkt ** ppkt_array)
{
    int ret = 0;
    
    //waiting for start msg from the sender.
    int chirp_len = 0;
    int pkt_size = sizeof(Udp_Probe_Pkt);

    Udp_Probe_Pkt rcv_pkt;
    Udp_Probe_Pkt *p = NULL;

    while(1){

        ret = recv_udp_pkt(sd, &rcv_pkt);
        if(0==rcv_pkt.hdr.pkt_idx 
                && MAX_CHIRP_LEN>rcv_pkt.hdr.chirp_len 
                && 1< rcv_pkt.hdr.chirp_len){
            chirp_len = rcv_pkt.hdr.chirp_len;
            p = (Udp_Probe_Pkt*)malloc((chirp_len+1) * pkt_size);

            if (NULL==p){
                perror("malloc.");
                PRINT_CHK_FLAG;
                return -1;
            }
            else{
                memset(p, 0, (chirp_len+1)* pkt_size);
                PRINT_CHK_FLAG;
                break;
            }
                
        }
		else 
		{
		return -1;
		}
	}
		
     for(int i=0;i<chirp_len;i++) 
	 {
	 ret=recv_udp_pkt(sd,&rcv_pkt);
	 memcpy((void*)(p+i),(void*)&rcv_pkt,pkt_size);
	 }
	 *ppkt_array=p;
	 return 1;
	}
/** \brief callback notified by \ref udp_full_t when to notify an event
 */
bool	socket_resp_udp_t::cnx_t::neoip_inet_udp_full_event_cb(void *userptr, udp_full_t &cb_udp_full
					, const udp_event_t &udp_event)		throw()
{
	KLOG_DBG("enter event=" << udp_event);
	// sanity check - the event MUST be full_ok
	DBG_ASSERT( udp_event.is_full_ok() );

	// if the udp_event_t is fatal, delete this cnx_t
	if( udp_event.is_fatal() ){
		nipmem_delete this;
		return false;
	}
	
	// handle each possible events from its type
	switch( udp_event.get_value() ){
	case udp_event_t::RECVED_DATA:{
			pkt_t *	pkt	= udp_event.get_recved_data();
			return recv_udp_pkt(*pkt);}
	default:	DBG_ASSERT( 0 );
	}
	// return 'tokeep'
	return true;
}