Beispiel #1
0
    // 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);
	    }
	}
    }
Beispiel #2
0
/* 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);
}