/* * === 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; }