예제 #1
0
void
TAO::DCPS::ReliableMulticast::detail::SenderLogic::receive(
  const TAO::DCPS::ReliableMulticast::detail::Packet& p,
  PacketVector& redelivered
  ) const
{
  redelivered.clear();
  if (p.type_ == TAO::DCPS::ReliableMulticast::detail::Packet::NACK)
  {
    for (
      TAO::DCPS::ReliableMulticast::detail::Packet::id_type id = p.nack_begin_;
      id != p.nack_end_;
      ++id
      )
    {
      BufferType::const_iterator iter = buffer_.find(id);

      if (iter != buffer_.end())
      {
        redelivered.push_back(iter->second);
      }
      else
      {
        redelivered.push_back(TAO::DCPS::ReliableMulticast::detail::Packet(
          id,
          TAO::DCPS::ReliableMulticast::detail::Packet::DATA_NOT_AVAILABLE
          ));
      }
    }
  }
}
예제 #2
0
void AddPacket(string name, string data)
{
	sPacket p;
	p.name = name;
	p.data = data;
	vPacket.push_back(p);
}
예제 #3
0
void
OpenDDS::DCPS::ReliableMulticast::detail::ReceiverLogic::deliver(
  PacketVector& delivered,
  const Packet& p
  )
{
  delivered.push_back(p);
  last_delivered_id_ = p.id_;
}
예제 #4
0
void
TAO::DCPS::ReliableMulticast::detail::SenderLogic::send(
  const TAO::DCPS::ReliableMulticast::detail::Packet& p,
  PacketVector& delivered
  )
{
  delivered.clear();
  if (
    p.type_ == TAO::DCPS::ReliableMulticast::detail::Packet::DATA_INTERMEDIATE ||
    p.type_ == TAO::DCPS::ReliableMulticast::detail::Packet::DATA_END_OF_MESSAGE
    )
  {
    buffer_packet(p, delivered);
  }
}
예제 #5
0
void
TAO::DCPS::ReliableMulticast::detail::SenderLogic::buffer_packet(
  const TAO::DCPS::ReliableMulticast::detail::Packet& p,
  PacketVector& delivered
  )
{
  TAO::DCPS::ReliableMulticast::detail::Packet tmp(p);

  if (buffersize() == sender_history_size_)
  {
    buffer_.erase(current_id_ - sender_history_size_);
  }
  tmp.id_ = current_id_;
  ++current_id_;
  buffer_.insert(std::make_pair(tmp.id_, tmp));
  delivered.push_back(tmp);
}
예제 #6
0
void ReadPacketXML(string filename)
{
	ifstream file(filename);
	using boost::property_tree::ptree;
	ptree pt;
	read_xml(file, pt);
	if(!pt.empty())
	{
		for(ptree::value_type const& v : pt.get_child("packetlist"))
		{
			if(v.first == "packet")
			{
				sPacket p;
				p.name = v.second.get<string>("name");
				p.data = v.second.get<string>("data");
				vPacket.push_back(p);
			}
		}
	}
}
예제 #7
0
void
OpenDDS::DCPS::ReliableMulticast::detail::ReceiverLogic::receive(
  const Packet& p,
  PacketVector& nacks,
  PacketVector& delivered
  )
{
  delivered.clear();

  // todo: validate
  if (!seen_last_delivered_)
  {
    if (
      p.type_ == Packet::DATA_INTERMEDIATE ||
      p.type_ == Packet::DATA_END_OF_MESSAGE
      )
    {
      last_delivered_id_ = p.id_ - 1;
      seen_last_delivered_ = true;
    }
    else
    {
      return;
    }
  }

  if (
    p.type_ == Packet::DATA_INTERMEDIATE ||
    p.type_ == Packet::DATA_END_OF_MESSAGE ||
    p.type_ == Packet::DATA_NOT_AVAILABLE
    )
  {
    bool prior_nack_canceled = nacker_.cancel(p.id_);

    if (in_range(p.id_, 1, receiver_buffer_size_ + receiver_buffer_size_))
    {
      if (p.id_ == last_delivered_id_ + 1)
      {
        Packet tmp_packet;

        deliver(delivered, p);
        while (get_and_remove_buffered_packet(
          last_delivered_id_ + 1,
          tmp_packet
          ))
        {
          deliver(delivered, tmp_packet);
        }
      }
      else if (!is_buffered(p))
      {
        if (
          p.type_ == Packet::DATA_INTERMEDIATE ||
          p.type_ == Packet::DATA_END_OF_MESSAGE
          )
        {
          buffer_packet(p, delivered);
          if (!prior_nack_canceled)
          {
            nacker_.nack_range(find_previous_received(p.id_) + 1, p.id_);
          }
        }
        else if (p.type_ == Packet::DATA_NOT_AVAILABLE)
        {
          handle_unreliable_operation(delivered);
        }
      }
    }
  }
  else if (p.type_ == Packet::HEARTBEAT)
  {
    if (!in_range(p.id_, 0 - 2 * receiver_buffer_size_, 0))
    {
      // NACK the last packet, which will send it along and
      // then trigger the above NACK code...
      nacker_.nack_range(p.id_, p.id_ + 1);
    }
  }

  nacker_.get_nacks(nacks);
}
예제 #8
0
void EditPacket(int i, string name, string data)
{
	vPacket.at(i).name = name;
	vPacket.at(i).data = data;
}
예제 #9
0
void DeletePacket(int i)
{
	vPacket.erase(vPacket.begin() + i);
}