#include
using std::cout;
using std::endl;
#include
int main()
double Simulation_Status;
{
if (Simulation_Status == 0) // load parameters
{
double PacketArrivalTime = 0.0;
double MeanPacketLength = 0.0;
int BufferSize = 0;
double LineSpeed = 0.0;
double SimulationTime = 0.0;
double TimeStamp = 0.0;
PoissonArrival TrafficModel;
int channel_state = 0;
long total_data_packets = 0;
long total_departed_pakcets = 0;
double total_packet_system_time = 0.0;
double total_packet_queueing_time = 0.0;
long number_of_packet_queued = 0;
long number_of_blocked_data = 0;
double channel_time = 0.0;
Q.Scheduled_Time = TrafficModel.next_arrival(PacketArrivalTime);
Q.Create_Time = Q.Scheduled_Time;
Q.length = TrafficModel.frame_length(MeanPacketLength);
Q.event = new_packet_arrival; Q.data_type = DATA;
Q.seq_no = Schedular.seq_no++;
Schedular.join_from_head(Q);
button1->Text = "Running...";
Simulation_Status = 1;
button1->Enabled = false;
textBox5->AcceptsReturn = true;
textBox5->AppendText("Simulation starts at " + DateTime::Now.ToLongTimeString() + "\n");
while (TimeStamp<1000)> 200000000)
Schedular.seq_no = 0;
switch(Q.event)
{
case new_packet_arrival:
if (TimeStamp > Q.Scheduled_Time)
textBox5->AppendText("error410\n");
else
{
TimeStamp = Q.Scheduled_Time;
if (channel_state == 0)
{
Q.event = departure;
Q.Scheduled_Time = ((floor(Q.length) * 8) / LineSpeed) + TimeStamp; ++channel_state;
Schedular.join_from_end(Q);
textBox5->AppendText(Q.seq_no + " enters server \n");
}
else if (DataBuffer.count < event =" queued;">AppendText(Q.seq_no + " enters queue \n");
}
else
{
textBox5->AppendText(Q.seq_no + " blocked! \n");
}
Q.data_type = DATA;
Q.event = new_packet_arrival;
Q.Scheduled_Time = TrafficModel.next_arrival(PacketArrivalTime) + TimeStamp; Q.Create_Time = Q.Scheduled_Time;
Q.length = TrafficModel.frame_length(MeanPacketLength);
Q.seq_no = Schedular.seq_no++;
Schedular.join_from_end(Q);
}
break;
case departure:
if (TimeStamp > Q.Scheduled_Time)
textBox5->AppendText("error447\n");
else
{
TimeStamp = Q.Scheduled_Time;
--channel_state;
if (Q.data_type == DATA)
{
}
if (DataBuffer.count != 0)
{
DataBuffer.get_event(Q);
Q.event = departure;
Q.Scheduled_Time = ((floor(Q.length) * 8) / LineSpeed) + TimeStamp; ++channel_state;
Schedular.join_from_end(Q);
total_packet_queueing_time += (TimeStamp - Q.Create_Time);
}
}
break;
}
}
textBox5->AppendText("Simulation ends at " + DateTime::Now.ToLongTimeString() + "\n");
button1->Text = "Finished"; Simulation_Status = 0;
double packet_loss_rate = double(number_of_blocked_data) / double(total_data_packets);
double average_delay = total_packet_system_time / double(total_departed_pakcets);
double average_queueing_delay = total_packet_queueing_time / double(total_departed_pakcets);
double average_queueing_delay2 = total_packet_queueing_time / double(number_of_packet_queued);
textBox5->AppendText("封包遺失率 = " + Convert::ToString(packet_loss_rate) + "\n"); textBox5->AppendText("平均延遲時間 = " + Convert::ToString(average_delay) + " sec.\n");
textBox5->AppendText("平均排程時間 = " + Convert::ToString(average_queueing_delay) + " sec.\n");
textBox5->AppendText("平均排程時間 if queued = " + Convert::ToString(average_queueing_delay2) + " sec.\n");
}
}
{
Simulation_Status = 0;
}
2008年6月27日 星期五
NS2技能的自我檢視
Q1: 數據上的誤差
在一些實驗中,有關係到封包遺失的模擬,似乎都有誤差,跟課本上面的數據有些出入,
想了解在模擬上的差異在哪邊
Q2: TCL的修改
在使用NS2時,經常要自行設計TCL檔,在實驗中經常要做一些變更,通常是直接更改原始碼,
比原來的使用JAVE來進行編輯要快速的多,但是修改的方式並非知道的很清楚,大部分都是
造課本上面的方式修改
Q3: 影像傳輸的精確度
在實驗六中,最後重建影像有模糊的跡象,但是並非一直模糊,時好時壞的感覺,是什麼原因造成這樣的結果
Q4: ./的差別
有時候在輸入指令的地方,開頭需要./來標註目前所在的位子,但有時候又不需要,而且不同
電腦也不一定需要使用,總覺得是個別電腦的問題,但是又想不出實際原因來
Q5: 轉檔的原因
從yuv->m4v->mp4,yuv應該用在撥放的地方,而mp4使用在網路傳輸上,為何不能跳過m4v
在一些實驗中,有關係到封包遺失的模擬,似乎都有誤差,跟課本上面的數據有些出入,
想了解在模擬上的差異在哪邊
Q2: TCL的修改
在使用NS2時,經常要自行設計TCL檔,在實驗中經常要做一些變更,通常是直接更改原始碼,
比原來的使用JAVE來進行編輯要快速的多,但是修改的方式並非知道的很清楚,大部分都是
造課本上面的方式修改
Q3: 影像傳輸的精確度
在實驗六中,最後重建影像有模糊的跡象,但是並非一直模糊,時好時壞的感覺,是什麼原因造成這樣的結果
Q4: ./的差別
有時候在輸入指令的地方,開頭需要./來標註目前所在的位子,但有時候又不需要,而且不同
電腦也不一定需要使用,總覺得是個別電腦的問題,但是又想不出實際原因來
Q5: 轉檔的原因
從yuv->m4v->mp4,yuv應該用在撥放的地方,而mp4使用在網路傳輸上,為何不能跳過m4v
訂閱:
文章 (Atom)