$NS/tclcl-1.17/tclcl.h, Tcl.cc
$NS/tclcl-1.17/tcl-object.tcl
class TclObject
- split object의 base class
- 제공하는 기능
- 멤버 변수 바인딩
- OTcl상에서 C++ 접근
- OTcl에서 선언된 split object의 C++상의 인스턴스 접근
- 바인딩
- split object의 OTcl상의 멤버변수와 C++상의 멤버변수를 묶어줌
- 어느 한곳의 값이 변하면 다른 곳에 바로 적용됨
- C++ 상에서 bind_XXX()함수 이용
- 보통 생성자에서 해줌
- bind("<OTcl상에서 멤버변수 이름>", &<C++상에서 멤버변수 이름>);
- ASRMAgent::ASRMAgent(){
- bind("pdistance_",&pdistance_);
- bind_time("lastSent_", &lastSessSent");
- bind_bw("ctrlLinit_",&ctrlBWLimit_);
- bind_bool("running_",&running_)
- }
- Bandwidth,Time은 고려해서 기본단위로 C++상의 멤버변수에 저장이 됨
- Boolean은 true면 1, false면 0이 C++상의 멤버변수에 저장
- 바인된 변수 초기화
- $ns/tcl/lib/ns-default.tcl에 추가
- 추가하지 않으면 경고가 뜸
- 5가지 변수
- real (double형)
- $object set realvar 1.2e3
- bandwidth (double형)
- $object set bwvar 1.5m
- $object set bwvar 1500k
- 접미사 지원
- kilo - k,K
- mega - m, M
- B - byte
- b - bit(default)
- time (double형)
- $object set timevar 1500m
- $object set timevar 1.5e9n
- $object set timevar 1.5e9p
- 접미사 지원
- mili second - m
- nano second - n
- pico second - p
- second - s(default)
- integer (int형)
- $object set intVar 12
- boolean (int형)
- true : 1 또는 t나 T로 시작하는 문자열
- $object set boolvar t
- $object set boolvar true
- $object set boolbar 1
- false : 0 또는 t나 T로 시작하지 않는 문자열
- $object set boolvar false
- $object set boolvar junk
- $object set boolvar 0
- true : 1 또는 t나 T로 시작하는 문자열
- OTcl상에서의 C++ 접근
- OTcl상에서 클래스의 멤버함수가 아닌 커맨드도 존재
- 커맨드가 클래스 멤버함수 중 존재하지 않으면
- $object cmd 커맨드 인자들
- cmd는 split object의 C++상의 클래스의 command()를 호출
- int ASRMAgent::command(int argc, const char*const*argv) {
- Tcl &tcl = tcl::instance();
- if(strcmp(argv[1], "distance?") == 0) {
- int sender = atoi(argv[2]);
- SRMinfo *sp = get_state(sender);
- tcl.resultf("%f",sp->distance_);
- return TCL_OK; //cf> TCL_ERROR
- }
- }
- return (SRMAgent::command(argc,argv));
- }
- argv[0] <- cmd
- argv[1] <- 명령어
- argv[2] <- arg1
- argv[3] <- arg2
- command()내에서 성공시 return TCL_OK; 실패시 return TCL_ERROR;를 해줘야 함
- Split object 접근
- class TclObject{
- ...
- inline static lookup(const char *name) {
- return (Tcl::instance().lookup(name));
- }
- }
- TclObject::lookup("oNNN")
- OTcl 상에서 reference가 _oNNN인 split object의 C++상의 인스턴스(포인터)를 리턴
- Typecasting을 해줘야 함
class Tcl
- OTcl interpreter에 접근하고 통신하는 방법을 제공
- OTcl 커맨드 실행
- interpreter에서 실행된 결과의 리턴 값을 얻어 옴
- interpreter로 결과값을 리턴
- Tcl &tcl = Tcl::instance();
- 이 instance로 OTcl interpreter 접근
- OTcl 명령어 실행(OTcl 상에서 실행
- tcl.eval(char *)
- tcl.evalc(const char *) : 문자열 상수인 경우 ""
- tcl.eval():tcl.buffer()있는 문자열로 실행
- tcl.evalf(const char *) : formated string
- OTcl로 / OTcl로부터 리턴
- 결과(리턴값-문자열)을 OTcl상으로 넘기거나, OTcl상에서부터 받아온다.
- 결과값 넘기기
- tcl.result(const char *s)
- tcl.resultf(const char* fmt, ...)
- 결과값 가져오기
- tcl.result()
class TclClass
- C++상의 클래스 계층에 대응하는 OTcl 상의 클래스 계층을 만든다.
- C++상의 클래스의 인스턴스를 만드는 멤버함수를 제공한다.
- static class RenoTcpclass:public TclClass{
- public:
- RenoTcpClass():TclClass("Agnet/TCP/Reno") {}
- TclObject* create(int argc, const char*const*argv){
- return (new RenoTcpAgent());
- }class_reno;
- 클래스 정의 후 인스턴스까지 만듬
- 생성자에서 하는 일은 없음
- 부모 생성자 TclClass가 전 슬라이드에 언급한 일을 수행
- argv[4] 부터 추가 변수
- new Agent/TCP/Reno 시 내부적으로 RenoTcpClass::create() 실행
- "Agent/TCP/Reno"는 OTcl상에 클래스 이름
- static 클래스 정의와 정시에 선언 => C++상의 클래스에 대응하는 OTcl상의 클래스의 계층을 만듦.
- SplitObject proc register className
- OTcl 상에서 SplitObject(TclObject)를 최상위로 해서 클래스 계층을 만들어 준다.
- create-shadow
- TclClass::create_shadow()를 호출, create()를 호출한다.
- 최종적으로 SplitObject의 생성자가 호출됨
- SplitObject는 $self create-shadow 호출
- create-shadow는 TclClass::create_shadow() 호출
- TclClass::create_shadow()는 create()호출
- TclClass를 상속한 class의 create()에서 C++상의 클래스의 인스턴스를 생성해야 함
'Network > Ns2_Lecture' 카테고리의 다른 글
Making NS-2 simulate an 802.11b link (0) | 2009.01.18 |
---|---|
NS2 - 무선환경 시뮬레이션 (0) | 2009.01.18 |
NS2 trace (0) | 2009.01.18 |
awk (0) | 2009.01.18 |
NS2 스크립트 - 유선환경 시뮬레이션 (0) | 2009.01.18 |