2.5 Lớp TclClass
Lớp biên dịch TclClass là một lớp ảo thuần túy. Các lớp được dẫn xuất từ lớp cơ sở này có hai chức năng: xây dựng cây phân cấp theo lớp thông dịch để ánh xạ sang cây phân cấp theo lớp biên dịch, và đưa ra các hàm để khởi khảo các đối tượng TclObjects mới. Mỗi lớp dẫn xuất như vậy được gắn với một lớp biên dịch xác định trong cây phân cấp biên dịch, và có thể khởi tạo các đối tượng mới của lớp biên dịch tương ứng.
Ví dụ: chúng ta xem xét lớp RenoTcpClass, được dẫn xuất từ lớp TclClass, và được gắn với lớp biên dịch RenoTcpAgent. Lớp RenoTcpClass sẽ khởi tạo các đối tượng mới của lớp RenoTcpAgent. Lớp biên dịch RenoTcpAgent là lớp được dẫn xuất từ lớp TcpAgent, bản thân lớp TcpAgent được dẫn xuất từ lớp Agent, và cuối cùng lớp Agent lại được dẫn xuất từ lớp TclObject.
Lớp RenoTcpClass được định nghĩa như sau:
static class RenoTcpClass: public TclClass {
public:
RenoTcpClass() : TclClass("Agent/TCP/Reno") {}
TclObject* create(int argc, const char*const* argv) {
return (new RenoTcpAgent());
}
} class_reno;
2.5.1 Kết hợp các biến thành viên tĩnh của lớp C++
Ở phần trước, chúng ta đã đề cập đến cách thức để nhìn thấy các biến thành viên của các đối tượng trọng C++ trong môi trường OTcl, tuy nhiên cơ chế này lại không thể áp dụng cho các biến thành viên tĩnh của các lớp C++. Đương nhiên là, chúng ta vẫn có thể tạo ra một biến trong OTcl tương ứng với biến thành viên tĩnh của mỗi đối tượng C++, tuy nhiên điều này lại hoàn toàn phá hỏng đi ý nghĩa của biến thành viên tĩnh.
Chúng ta không thể giải quyết vấn đề kết hợp biến này theo các giải pháp tương tự như việc kết hợp biến trong TclObject, bởi vì cơ chế kết hợp biến trong TclObject dựa trên lớp InstVar mà lớp này trong TclCl lại đòi hỏi sự hiện diện của một đối tượng TclObject cụ thể. Tuy nhiên, chúng ta có thể tạo ra một hàm thuộc lớp TclClass tương ứng và thực hiện việc truy xuất tới biến thành viên tĩnh của lớp C++ thông qua hàm này. Các bước để thực hiện việc này như sau có thể tham khảo trong tài liệu hướng dẫn NS, trang 30.
2.6 Lớp TclCommand
Lớp TclCommand đưa ra cơ chế cho phép NS chuyển các câu lệnh đơn giản tới bộ thông dịch, và các câu lênh này có thể được thực hiện bởi bộ thông dịch trong môi trường chung.
Có hai hàm: ns-random và ns-version thường được sử dụng trong môi trường chung, cả hai hàm này được khởi tạo bởi hàm init_misc(void), và hàm init_misc được gọi bởi hàm Tcl_AppInit(void) trong quá trình NS được nạp vào bộ nhớ.
Lớp VersionCommand, định nghĩa hàm ns-version, hàm này không có tham số đầu vào, và trả về phiên bản NS hiện thời dạng chuỗi.
Lớp RandomCommand, định nghĩa hàm ns-random, không tham số đầu vào, trả về một giá trị nguyên ngẫu nhiên nằm trong khoảng [0, 231-1].
Ví dụ:
% ns-version
2.0a12
% ns-random
12334556
2.7 Lớp EmbeddedTcl
NS cho phép phát triển các chức năng hoặc bằng mã biên dịch hoặc bằng mã thông dịch, các mã này sẽ được kiểm tra khi khởi động NS. Chẳng hạn như các thư viện mã ~tclcl/tcl-object.tcl, ~ns/tcl/lib/*.tcl. Việc nạp và kiểm tra các mã kịch bản này sẽ được thực hiện thông qua các đối tượng trong lớp EmbeddedTcl.
Cách đơn giản nhất để mở rộng NS là thêm các mã OTcl hoặc là vào file tcl-object.tcl hoặc vào các kịch bản trong thư mục ~ns/tcl/lib/. Cần lưu ý rằng, đối với trường hợp thứ hai, NS nạp file ~ns/tcl/lib/ns-lib.tcl một cách tự động, vì vậy người lập trình phải thêm vào file này hai dòng để đảm bảo kịch bản của mình được tự động nạp vào lúc NS khởi động. Ví dụ để thêm vào kịch bản tcl/mcast/srm.tcl định nghĩa các thủ tục cho phép chạy SRM, trong file ns-lib.tcl xuất hiện dòng lệnh
source tcl/mcast/srm.tcl
Có ba điểm cần lưu ý đối với mã EmbeddedTcl là: thứ nhất nếu trong quá trình kiểm tra mã bị lỗi thì ns sẽ không chạy, thứ hai người sử dụng có thể ghi đè lên bất kỳ đoạn mã nào trong thư viện mã, cụ thể là chúng có thể được thay đổi. Cuối dùng, sau khi thêm các kịch bản vào ns-lib.tcl, cũng như mỗi lần sửa đổi sau đó, người sử dụng phải biên dịch lại ns để những thay đổi đó có hiệu lực
2.8 Lớp InstVar
Lớp InstVar định nghĩa các hàm và đưa ra các cơ chế để kết hợp một biến C++ trong đối tượng biên dịch với một biến OTcl xác định trong đối tượng thông dịch tương ứng. Việc kết hợp này cho phép giá trị của biến có thể được thay đổi trong cả hai môi trường: thông dịch và biên dịch ở mọi thời điểm.
Có năm lớp biến: InstVarReal, InstVarTime, InstVarBandwidth, InstVarInt và InstVarBool, được sử dụng để kết hợp 5 kiểu biến: thực, nguyên, thời gian, logic và băng thông tương ứng.
3. Lớp Simlator
Tất cả bộ mô phỏng được mô tả bởi lớp Tcl của bộ mô phỏng. Nó cung cấp một tập các giao diện cho việc đặt cấu hình mô phỏng và lựa chọn kiểu của bộ định trình sự kiện sử dụng để điều khiển việc mô phỏng. Một kịch bản mô phỏng nói chung bắt đầu bởi việc tạo ra một lớp cụ thể và gọi các phương thức khác nhau để tạo các nút, các cấu trúc liên kết mạng và cấu hình các khía cạnh khác của sự mô phỏng.
3.1 Khởi tạo bộ mô phỏng
Khi một đối tượng mô phỏng được tạo ra trong tcl, thủ tục khởi tạo được thực hiện theo các thao tác:
- Khởi tạo định dạng gói (gọi hàm create_packetformat)
- Tạo bộ định trình (mặc định là bộ định trình lịch)
- Tạo một "tác tử rỗng"(null agent - nơi để hủy gói trong ở các ví trí khác nhau)
Sự khởi tạo định dạng gói thiết lập các trường dư với các gói được sử dụng trong suốt quá trình mô phỏng. Bộ định trình thực hiện mô phỏng theo cách điều khiển sự kiện và có thể được thay thế bởi bộ định trình luân phiên mà ở đó cung cấp một vài ngữ nghĩa khác nhau (xem các phần dưới đây để có thêm chi tiết)
tác tử rỗng được tạo ra theo lời gọi:
set nullAgent_ [new Agent/Null]
Tác tử này nói chung là hữu ích như là một nơi để hủy gói hoặc như là một cái đích cho các gói không được đếm hoặc được ghi lại.
Chia sẻ với bạn bè của bạn: |