static tb_long_t tb_dns_looker_resp(tb_dns_looker_impl_t* impl, tb_ipaddr_ref_t addr) { // check tb_check_return_val(!(impl->step & TB_DNS_LOOKER_STEP_RESP), 1); // need wait if no data impl->step &= ~TB_DNS_LOOKER_STEP_NEVT; // recv response data tb_byte_t rpkt[4096]; while (1) { // read data tb_long_t read = tb_socket_urecv(impl->sock, tb_null, rpkt, 4096); //tb_trace_d("read %d", read); tb_assert_and_check_return_val(read >= 0, -1); // no data? if (!read) { // end? read x, read 0 tb_check_break(!tb_static_buffer_size(&impl->rpkt)); // abort? read 0, read 0 tb_check_return_val(!impl->tryn, -1); // tryn++ impl->tryn++; // continue return 0; } else impl->tryn = 0; // copy data tb_static_buffer_memncat(&impl->rpkt, rpkt, read); } // done if (!tb_dns_looker_resp_done(impl, addr)) return -1; // check tb_assert_and_check_return_val(tb_static_string_size(&impl->name) && !tb_ipaddr_ip_is_empty(addr), -1); // save address to cache tb_dns_cache_set(tb_static_string_cstr(&impl->name), addr); // finish it impl->step |= TB_DNS_LOOKER_STEP_RESP; impl->tryn = 0; // reset rpkt impl->size = 0; tb_static_buffer_clear(&impl->rpkt); // ok tb_trace_d("response: ok"); return 1; }
static tb_long_t tb_aiop_spak_urecv(tb_aiop_ptor_impl_t* impl, tb_aice_t* aice) { // check tb_assert_and_check_return_val(impl && aice, -1); tb_assert_and_check_return_val(aice->code == TB_AICE_CODE_URECV, -1); tb_assert_and_check_return_val(aice->u.urecv.data && aice->u.urecv.size, -1); tb_assert_and_check_return_val(aice->u.urecv.addr.u32 && aice->u.urecv.port, -1); // the aico tb_aiop_aico_t* aico = (tb_aiop_aico_t*)aice->aico; tb_assert_and_check_return_val(aico && aico->base.handle, -1); // try to recv it tb_size_t recv = 0; tb_long_t real = 0; while (recv < aice->u.urecv.size) { // recv it real = tb_socket_urecv(aico->base.handle, &aice->u.urecv.addr, aice->u.urecv.port, aice->u.urecv.data + recv, aice->u.urecv.size - recv); // save recv if (real > 0) recv += real; else break; } // trace tb_trace_d("urecv[%p]: %{ipv4}: %lu, %lu", aico, &aice->u.urecv.addr, aice->u.urecv.port, recv); // no recv? if (!recv) { // wait it if (!real && !aico->waiting) { // wait ok? if (tb_aiop_spak_wait(impl, aice)) return 0; // wait failed else aice->state = TB_STATE_FAILED; } // closed else aice->state = TB_STATE_CLOSED; } else { // ok or closed? aice->state = TB_STATE_OK; // save the recv size aice->u.urecv.real = recv; } // reset wait aico->waiting = 0; aico->aice.code = TB_AICE_CODE_NONE; // ok return 1; }
static tb_long_t tb_dns_looker_resp(tb_dns_looker_t* looker, tb_ipaddr_ref_t addr) { // check tb_check_return_val(!(looker->step & TB_DNS_LOOKER_STEP_RESP), 1); // need wait if no data looker->step &= ~TB_DNS_LOOKER_STEP_NEVT; // recv response data tb_size_t size = tb_static_buffer_size(&looker->rpkt); tb_size_t maxn = tb_static_buffer_maxn(&looker->rpkt); tb_byte_t* data = tb_static_buffer_data(&looker->rpkt); while (size < maxn) { // read data tb_long_t read = tb_socket_urecv(looker->sock, tb_null, data + size, maxn - size); tb_assert_and_check_return_val(read >= 0, -1); // no data? if (!read) { // end? read x, read 0 tb_check_break(!tb_static_buffer_size(&looker->rpkt)); // abort? read 0, read 0 tb_check_return_val(!looker->tryn, -1); // tryn++ looker->tryn++; // continue return 0; } else looker->tryn = 0; // update buffer size tb_static_buffer_resize(&looker->rpkt, size + read); size = tb_static_buffer_size(&looker->rpkt); } // done if (!tb_dns_looker_resp_done(looker, addr)) return -1; // check tb_assert_and_check_return_val(tb_static_string_size(&looker->name) && !tb_ipaddr_ip_is_empty(addr), -1); // save address to cache tb_dns_cache_set(tb_static_string_cstr(&looker->name), addr); // finish it looker->step |= TB_DNS_LOOKER_STEP_RESP; looker->tryn = 0; // reset rpkt looker->size = 0; tb_static_buffer_clear(&looker->rpkt); // ok tb_trace_d("response: ok"); return 1; }