2008年6月27日 星期五

[公告]期末統計

這學期在今天正式落幕了
過去大家所努力的成果統計在這裡
由於關係到評量成績,請各位做進一步的確認
很多同學很用心,為大家鼓鼓掌

9426135 期末程式

找不到空間可以放程式,先把主體放上來,等找到空間再改


以下是程式碼


//從大二上之後就在也沒有碰過 C語言,寫這程式真的有點吃力,尤其是我也沒有學過物件導向的 C++,為了這個程式,還去念了一點書,但是還是無法寫出一個可以運作的結果,感謝實驗室學長的幫忙,我才知道要怎麼著手,但是還是模仿居多,為樂自己的專題著想,大肆還是多去研究點程式的寫法,不然會很淒慘吧。

//寫這程式,首先把老師的程式碼片段都給下載下來,然後好好的看了一下,之後亂拼湊一通,當然BUG一堆,慢慢修改過後,還是搞不定,舊只能丟個屍體出來。

//include的方法,請參閱各CPP的參考書
#include          //這個表頭檔包含了所有的輸入輸出的function
using namespace std;
#include "PoissonArrival.h"  //老師所給的.h檔案
#include "DynamicQueue.h"    //老師所給的.h檔案

//程式本體內,有些變數沒有被宣告到,剛開始就給她ㄧ個值吧
//宣告一些常數
#define departure 2 這個值很重要,剛開始忘了宣告,會出現很多BUG
#define queued 3
#define DATA 2048


Dynamic_Link_Queue Schedular;
Dynamic_Link_Queue DataBuffer;
Queue Q;


 
//從下面開始,是老師寫的程式本體,複製下來就給它放進去吧
int main()
{
       int Simulation_Status;  //加入一些缺的宣告值          
                int new_packet_arrival=1;   //加入ㄧ些缺的宣告值
                double PacketGeneratingRate=0.0;
double PacketArrivalTime = 0.0;
double MeanPacketLength = 0.0;  //integer in bytes, 
int BufferSize = 0;
double LineSpeed = 0.0;
double SimulationTime = 0.0;

//try{            // 應該要有程式防止錯誤的輸入,這裡省略
cout<<"Packet Generating rate(Packets/sec):";
cin>>PacketGeneratingRate;
        PacketArrivalTime = 1.0 / PacketGeneratingRate;
cout<<"Mean Packet Length(Bytes):";
cin>>MeanPacketLength;
cout<<"Buffer size:";
cin>>BufferSize;
cout<<"Line Speed(Bit/sec):";
cin>>LineSpeed;
cout<<"Simulation Time(sec):";
cin>>SimulationTime;
//}

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; // 統計輸出線路忙線的時間
while(Schedular.get_event(Q) != Empty){} // 清空 Queue,這裡拿來示範,這兩行在這個程式沒作用
while(DataBuffer.get_event(Q) != Empty){}

Q.Scheduled_Time = TrafficModel.next_arrival(PacketArrivalTime);
Q.Create_Time = Q.Scheduled_Time;
Q.length = TrafficModel.frame_length(MeanPacketLength);  // double, however it should be integer in bytes in realistic
Q.event = new_packet_arrival;
Q.data_type = DATA;
Q.seq_no = Schedular.seq_no++;
Schedular.join_from_head(Q);




//OutputFile1 = File_name->Text; // 輸出結果資料檔位置

cout<<"Running..."<
Simulation_Status = 1;

// 開始模擬
// transient state
          while (TimeStamp<1000)>
          {
            Schedular.get_event(Q);
            if (Schedular.seq_no > 200000000)
              Schedular.seq_no = 0;
            //Memo->Lines->Add(IntToStr(Schedular.count));
            //Memo->Lines->Add(IntToStr(Q.event));
            switch(Q.event)
            {
            case new_packet_arrival:
              if (TimeStamp > Q.Scheduled_Time)
                cout<<<">
              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);

 cout<
                }
                else if (DataBuffer.count <>
                {
                  // 若無可用通道但有可用buffer
                  Q.event = queued;
                  DataBuffer.join_from_end(Q);
 cout<
                }
                else
                {
                  // 若無可用通道也無可用buffer
                  // block this call
                  // not count in transient state
cout<
                }

                // schedule creating new data packet
                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)
                cout<<<"error447"<
              else
              {
                TimeStamp = Q.Scheduled_Time;
                // Recording

                //if (used_channels <>
                //  Memo->Lines->Add("error248");

                --channel_state; // 這樣寫是有風險的,但是也容易發覺蟲子
                if (Q.data_type == DATA)
                {
                  // 一定是
                  
                }
cout<

                if (DataBuffer.count != 0)
                {
                  DataBuffer.get_event(Q);

                  Q.event = departure;
                  Q.Scheduled_Time = ((floor(Q.length) * 8) / LineSpeed) + TimeStamp;
 // 上式因為Q.length的結構是 double,不過一般封包長度是用byte做單位,所以做一些長度的修正
                  ++channel_state;
                  Schedular.join_from_end(Q);

 cout<
                }
              }
              break;
            }
          }
          

// 開始模擬
// steady state
        while (TimeStamp <>
{
// 加油,和上面的程式碼一樣,但要加上統計值的記錄
//TimeStamp += SimulationTime; // 只是讓迴圈結束

// 忍不住寫一下
Schedular.get_event(Q);
            if (Schedular.seq_no > 200000000)
              Schedular.seq_no = 0;
            
            switch(Q.event)
            {
            case new_packet_arrival:
              if (TimeStamp > Q.Scheduled_Time)
                cout<<<"error503"<
              else
              {
                TimeStamp = Q.Scheduled_Time;

++total_data_packets; // 產生的封包數+1

                if (channel_state == 0)
                {
                  // 若有可用通道
                  Q.event = departure;
                  Q.Scheduled_Time = ((floor(Q.length) * 8) / LineSpeed) + TimeStamp;
                  ++channel_state;
                  Schedular.join_from_end(Q);
                }
                else if (DataBuffer.count <>
                {
                  // 若無可用通道但有可用buffer
                  Q.event = queued;
                  DataBuffer.join_from_end(Q);

 ++number_of_packet_queued;
 cout<

                }
                else
                {
                  // 若無可用通道也無可用buffer
                  // block this call
                  ++number_of_blocked_data;
                }

                // schedule creating new data packet
                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)
                cout<<<"error447"<
              else
              {
                TimeStamp = Q.Scheduled_Time;
                // Recording
++total_departed_pakcets;
total_packet_system_time += (TimeStamp - Q.Create_Time);
                //if (used_channels <>
                //  Memo->Lines->Add("error248");

                --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;
            }
}
cout<<"Finished"<
Simulation_Status = 0;

// 效能計算
// 封包遺失率 = lost packet / generated packet; 這裡有一點誤差,因為沒有計算還在queue裡面的封包,不過因為數量太少影響不大。
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);
// 平均排程時間 | if queued
double average_queueing_delay2 = total_packet_queueing_time / double(number_of_packet_queued);
cout<<"封包遺失率 = " <<>
        cout<<"平均延遲時間 = " <<>
cout<<"平均排程時間 = " <<>
cout<<"平均排程時間 | if queued = " <<>
cin.get();
cin.get();
}

期末程式作業 9326149 朱衍印

期末程式作業

9428122 塗智宇 期末程式

期末程式

9428122 塗智宇 NS2技能的自我檢視

NS2技能的自我檢視

9428132 葉育辰 期末程式

http://impulse502.blogspot.com/2008/06/9428132.html

9676049 阮文正 期末程式

9676049 阮文正 期末程式

NS2技能的自我檢視 9326149 朱衍印

NS2技能的自我檢視 9326149 朱衍印

9326259 葉友綸 期末程式

9326259 葉友綸 期末程式

NS2技能的自我檢視 9326245 馬瑱賢

NS2技能的自我檢視

2008年6月24日 星期二

2008年6月23日 星期一

9326253 彭治平 NS2技能的自我檢視

NS2技能的自我檢視

ns2技能檢視 9676050 張佑任

Q1.create -god 使用目的為何?
在實驗五中,有一個create-要設定基地台個數+mobile host個數但是這個god_有需要嗎?

Q2. 執行影像編碼解碼作效能測試中轉檔兩次的目的是?
在實驗六中,使用ffmpeg對原始YUV檔案轉換成m4v檔案再轉成mp4檔案,轉兩次的目的為何?

Q3. G++ & make 指令差異?
在ns2中要使所提供的小工具前要先編譯,會使用g++指令作編譯動作,與make 指令差異為何?

Q4. 承上,而小工具又要如何與NS2連結進行編譯?
使用exlonked進行編譯?
5. ./XXX.exe means PWD ?
會看到./XXX.exe ,此在linux指的是在當前目錄下的路徑嗎?

自我檢視的五個問題5/5

問題:aodv的資料夾裡的文件是做啥用的??
描述:安裝NS2後裡面會有一個aodv的資料夾,裡面有一些文件,請問那些文件是做啥用的

自我檢視的五個問題4/5

問題:請問要如何用NS2來模擬mpls呢??
描述:聽說mpls是一種採用高網路層的網路技術,想知道是如何模擬的

自我檢視的五個問題3/5

問題:如何在Ubuntu下安裝NS2??
描述:純粹想了解一下而已

自我檢視的五個問題2/5

問題:NS2使用TCL語言有何優點??
描述:也不知道要描述什麼......想知道一下!!

自我檢視的五個問題1/5

問題:NS2使用c++語言有何優點??
描述:不知道描述什麼......

9426135 鍾昱宏 我檢視的五個問題(5-5)

問題:在重新編譯NS2時,會有下列的問題出現

問題敘述:

proxytrace2any.cc: In function `int main(int, char**)':
proxytrace2any.cc:112: error: `IsLittleEndian' undeclared (first use this function)
proxytrace2any.cc:112: error: (Each undeclared identifier is reported only once for each function it appears in.)
proxytrace2any.cc:120: error: `ToOtherEndian' undeclared (first use this function)
make[1]: *** [proxytrace2any.o] Error 1


問題答案:

問題點在於 proxytrace2any.cc這隻程式,因為使用到兩個未經定義(undeclared) 的函數。修正的方法:找到下列檔案 /indep-utils/webtrace-conv/dec/my-endian.h

將 #ifndef _ENDIAN_H_ 與 #endif 兩行註解
起來,其他地方不變。

//#ifndef _ENDIAN_H_
#define _ENDIAN_H_
#include "proxytrace.h"

/* detects endian-ness */
int IsLittleEndian(void);

/* changes endian-ness */
void ToOtherEndian(TEntry *e);
//#endif

9426135 鍾昱宏 我檢視的五個問題(5-4)

問題:AODV和DSDV的不同點,RREQ又是何物

問題描述:
在實驗中,有模擬到AODV和DSDV 那它們之間又有何不同?而AODV會發出RREQ,那RREQ是什麼?

問題回答:
Ad hoc On Demand Distance Vector (AODV) protocol 是一個專門為 Ad hoc 移動網路所設計的通訊協定。AODV

是一個無迴路,由來源主機開始啟動,且能擴展到大量移動節點的一種通訊協定;和 DSDV 不同的地方在於,AODV

是一種在需要時才啟用的路由協定,意即當有來源端主機想傳送資料時,才開始建立由來源主機至目的主機的路由

(Route)。


RREQ 中的訊息如下:

這些訊息分別為:來源主機的 IP 位址、來源端的序列號碼、廣播 ID、目的主機的 IP 位址、目的端的序列號碼,最

後是經過的 hop 數。

RREP 則會包含如下的訊息:

這些訊息分別為:來源主機的 IP 位址、目的主機的 IP 位址,目的端的序列號碼,經過的 hop 數以及連線的有效存活



9426135 鍾昱宏 我檢視的五個問題(5-3)

問題:在NS2中如何取得節點位置

問題描述:
NS2中要如何取得node position 與speed

問題回答:
可使用 getLoc()函數、getVelo(),speed()函數
函式的定義是在:/common/mobilenode.h
所以使用時記得 include這個標頭檔。
(1)取得節點座標
使用MobileNode 類別內的 getLoc() 函數:
double x = 0.0, y = 0.0, z = 0.0; //傳入三變數
Node *thisnode; // 宣告指標
thisnode = Node::get_node_by_address(index);
((MobileNode *)thisnode)->getLoc(&x, &y, &z);
(2)取得節點速度
使用MobileNode 類別內的 getVelo() 函數,用法同上:
double x = 0.0, y = 0.0, z = 0.0; //傳入三變數
Node *thisnode; // 宣告指標
thisnode = Node::get_node_by_address(index);
((MobileNode *)thisnode)->getVelo(&x, &y, &z);
或者使用 speed()函數
Node *thisnode; // 宣告指標
double [...]

9426135 鍾昱宏 自我檢視的五個問題( 5-2)

問題:美洲豹(mac os x 10.5.3)不能跑網路NS2

問題描述:
一整個學期,都是用parallels desktop模擬XP2來完成作業,前天在逛apple的網站的時候,看到下列的的訊息 http://www.apple.com.tw/macosx/technology/unix.html,NS2需要在UNIX的環境底下模擬,那MAC裡就有完整的模擬環境,是不是就可以直接去編譯執行NS2

PS:我試過了,不行執行,難道國外用MAC的人,就不能做網路模擬的研究嗎?

9426135 鍾昱宏 自我檢視的五個問題(5-1)

問題一:如何在linux下安裝NS2

問題描述:
雖然這學期我們所模擬時,使用的作業系統是XPSP2,但是在網路上因為linux程式碼開放的關係,很多人也都改用了linux作業系統,那在這作業系統裡,要如何安裝NS2,畢竟安裝NS2是一個大工程,在此提出小小的疑惑。

2008年6月19日 星期四

作業(3/5):NS2技能自我檢視

作業(3/5):NS2技能自我檢視

作業(2/5):NS2技能自我檢視

作業(2/5):NS2技能自我檢視

作業(1/5):NS2技能自我檢視

作業(1/5):NS2技能自我檢視

作業上傳截止日期

Dear all,

課程的作業到6/22日止為上傳的期限,超過就算沒交了。另外C程式到目前還沒人交,請盡快上傳,如果沒寫完也請上傳,有多少傳多少。沒有上傳的我在這裡先說抱歉。

另外請你們寫的五個問題作業:NS2技能的自我檢視也請趕快寫,沒寫的我也先說抱歉。

最後祝大家暑假愉快

更正:之前助教好像有跟你們提過作業上傳期限包含期末考週,所以我把期限延後一周到6/27(五)。

實驗十(9326362 邱顯昌)

http://gogochang.blogspot.com/2008/06/blog-post_18.html

實驗十(9326362 邱顯昌)

http://gogochang.blogspot.com/2008/06/blog-post_18.html

實驗九(9326362 邱顯昌)

http://gogochang.blogspot.com/2008/06/blog-post_11.html

2008年6月11日 星期三

2008年6月4日 星期三

Comprehension to NS2

進階者可以進來看,這裡將NS2擺回到工具的角色,利用工具完成我們想要研究的課題。
http://hunghuan.liu.googlepages.com/comprehensiontons2


學期只剩下一點時間,這個project應該是做不完,暑假期間有空會陸續完成有興趣的自己follow。另外你們思考的結果和設計的程式可以另外開個一網頁貼上來討論討論。

2008年6月3日 星期二

NS2的擴充方法(三)

Sec. 4.4 Add New Queue
http://hunghuan.liu.googlepages.com/addnewqueue

NS2 Class Hierarchy:
http://www-rp.lip6.fr/ns-doc/ns226-doc/html/inherits.htm

Sec. 5.1 LAN Example
下載http://nile.wpi.edu/NS/Example/ex-lan.tcl執行,在我的電腦上不能執行。請各位動動腦抓bug。
網路上下載的東西有些會有版本的問題,太舊了不能在新版的NS2上執行,若碰到這個問題按照程式設計師的經驗:重寫可能會比較快!不過我們在學習,所以請修正程式的錯誤使他可以執行。

Sec. 5.2 Multicasting 和 Sec. 5.3 Web Server Example也有版本的問題

實驗七 9326362 邱顯昌

http://gogochang.blogspot.com/2008/06/myealvid-nt.html