invalid command name "Agent/TCPSink/mTcpSink"
原來mTCP是由柯志亨先生開發出的Agent,可以在連線中記錄封包的訊息(到底多了哪些訊息我還不清楚,可參考文件),加入的方式如下:
- 下載相關的程式碼 載點於此(連結遺失的話,請google://smallko)
mudp.cc mudp.h mudpsink.cc mudpsink.h mtcp.cc mtcp.h mtcpsink.cc mtcpsink.h 等 - 在ns2的原始碼根目錄新增mesure目錄,把檔案都丟進去
如 ns-allinone-$VERSION/ns-$VERSION/mesure - 修改ns-allinone-$VERSION/ns-$VERSION/common/packet.h
在 sturct hdr_cmn{ ... } 之中加入以下宣告:
int frametype_; // added by smallko double sendtime_; // added by smallko unsigned int pkt_id_; // added by smallko unsigned int frame_pkt_id_; // added by smallko
- 修改ns-allinone-$VERSION/ns-$VERSION/Makefile,沒有的話,請先在ns-$VERSION 目錄中下 ./configure 的指令以產生Makefile,找到Makefile後在OBJ_CC中(下一行)加入
measure/mudp.o measure/mudpsink.o \ (這行依自己的需求修正,如果需要mTCPSink,就是加入 mtcpsink.o)
- 修改ns-allinone-$VERSION/ns-$VERSION/tcl/lib/ns-default.tcl,找到 Agent/Ping set packetSize_ 後,在下一行加入
Agent/mUDP set packetSize_ 1000
- 再來make install 應該就可以正常安裝了
- 但是,接下來是我碰到的狀況,我在使用all in one 懶人安裝的時候發現在ns-2.35裡面make的時候會出錯,訊息如下:
g++ -c -Wall -Wno-write-strings -DTCP_DELAY_BIND_ALL -DNO_TK -DTCLCL_CLASSINSTVAR -DNDEBUG -DLINUX_TCP_HEADER -DUSE_SHM -DHAVE_LIBTCLCL -DHAVE_TCLCL_H -DHAVE_LIBOTCL1_14 -DHAVE_OTCL_H -DHAVE_LIBTK8_5 -DHAVE_TK_H -DHAVE_LIBTCL8_5 -DHAVE_TCLINT_H -DHAVE_TCL_H -DHAVE_CONFIG_H -DNS_DIFFUSION -DSMAC_NO_SYNC -DCPP_NAMESPACE=std -DUSE_SINGLE_ADDRESS_SPACE -Drng_test -I. -I. -I/home/bency/ns2_2.35/ns-allinone-2.35/tclcl-1.20 -I/home/bency/ns2_2.35/ns-allinone-2.35/otcl-1.14 -I/home/bency/ns2_2.35/ns-allinone-2.35/include -I/home/bency/ns2_2.35/ns-allinone-2.35/include -I/home/bency/ns2_2.35/ns-allinone-2.35/include -I/usr/include/pcap -I./tcp -I./sctp -I./common -I./link -I./queue -I./adc -I./apps -I./mac -I./mobile -I./trace -I./routing -I./tools -I./classifier -I./mcast -I./diffusion3/lib/main -I./diffusion3/lib -I./diffusion3/lib/nr -I./diffusion3/ns -I./diffusion3/filter_core -I./asim/ -I./qs -I./diffserv -I./satellite -I./wpan -o measure/mudp.o measure/mudp.cc measure/mudp.cc: In constructor ‘mUdpAgent::mUdpAgent()’: measure/mudp.cc:19:21: error: cannot call constructor ‘mUdpAgent::UdpAgent’ directly [-fpermissive] measure/mudp.cc:19:21: error: for a function-style cast, remove the redundant ‘::UdpAgent’ [-fpermissive]
這時我們需要在Makefile裡 g++ 的flag加上 -fpermissive,位置是在CCOPT,原本是長這樣(也許各個作業系統不一樣,我用的是 ubuntu 11.10)
CCOPT = -Wall -Wno-write-strings
修改後
CCOPT = -Wall -Wno-write-strings -fpermissive
這樣就可以make install了,但這是指手動在ns-$VERSION底下make install,如果回到ns-allinone 直接懶人安裝,他會再執行一次configure,會把剛剛辛苦改好的Makefile蓋掉,所以這時候要改一下configure。 - 在ns-allinone-$VERSION/ns-$VERSION/configure 裡面找 "-Wall -Wno-write-strings",這也許會因作業系統而異,請以第7點預設的CCOPT去搜尋,
在後面加上 -fpermissive(需要加在引號內),這樣就可以使用all-in-one懶人安裝把mUDP mTCPSink等新的Agent 加進ns2了。
參考資料:
http://blog.sina.com.cn/s/blog_4bb73ce80100m18r.html
http://140.116.164.80/~smallko/ns2/
謝謝大大熱心分享︿︿
回覆刪除想請教關於第8點
搜尋到的-Wall -Wno-write-strings 有2筆
第一筆是-Wall -Wno-write-strings -Wno-parentheses -Werror
第二筆是-Wall -Wno-write-strings
要加-fpermissive的是只有第二筆嗎?
看一下那兩筆的上層的switch分別是指定哪種作業系統,只要修改你現在正在用的作業系統的那筆就可以了,或是你也可以看一下錯誤訊息出現的是「-c -Wall -Wno-write-strings -DTCP_DELAY_BIND_ALL -DNO_TK」,就是你說的第二筆了
回覆刪除