// Send pending ACKs back to sender for packets already received void send_pending_acks() { if (!invalidated()) { while (!xmit_acks.empty()) { ack_send_buf.frame_prepare(*frame_, Frame::WRITE_ACK_STANDALONE); // encapsulate standalone ACK generate_ack(ack_send_buf); // transmit it net_send(ack_send_buf, NET_SEND_ACK); } } }
/* when need to send an ack pakcet, invoke the function */ void send_ack_packet(int ack_num, bt_config_t* config, bt_peer_t* toPeer) { int len; /* ack_num == 0 means duplicate data packet */ if (ack_num == 0) return; DPRINTF(DEBUG_SOCKETS, "send ack packet: %d\n", ack_num-1); /* generate ack packet */ char* packet = generate_ack(ack_num, &len); /* send ack packet */ send_packet(config->sock, packet, len, 0, (struct sockaddr *)&toPeer->addr, sizeof(toPeer->addr)); free(packet); /* reset timer */ set_connection_timeout(toPeer->down_con, CONNECTION_TIMEOUT, 0); }