Đóng gói (Encapsulation)

Một phần của tài liệu Omnet và các ứng dụng (Trang 62 - 63)

5. MODULE ĐƠN GIẢN

6.1.4.Đóng gói (Encapsulation)

Đóng gói gói tin

Thực sự cần thiết phải đóng gói một message khi bạn tiến hành mô phỏng các lớp giao thức của một mạng máy tính. Các tốt nhất để đóng gói một message là thêm vào message một danh sách các tham số đặc biệt. OMNeT++ cung cấp cho người sử dụng hàm encapsulate() để đóng gói các message. Kích thước (chiều dài) của các message sẽ tăng lên một phần bằng kích thước của phần thông tin thêm vào.

cMessage *userdata = new cMessage("userdata"); userdata->setLength(8*2000);

cMessage *tcpseg = new cMessage("tcp"); tcpseg->setLength(8*24);

tcpseg->encapsulate(userdata);

ev << tcpseg->length() << endl; // --> 8*2024 = 16192

Một message chỉ có thể mang một phần thông tin thêm. Điều này có nghĩa là nếu hàm encapsulate() được gọi lần thứ hai, nó sẽ sinh ra lỗi. Ngoài ra lỗi cũng phát sinh nếu message được đóng gói không thuộc một module nào.

Bạn có thể lấy lại phần thông tin thêm vào bằng hàm decapsulate() cMessage *userdata = tcpseg->decapsulate();

Hàm decapsualate() sẽ làm chiều dài của message (trừ trường hợp phần thêm vào có chiều dài bằng 0). Nếu chiều dài của message sau khi thực hiện lệnh trở thành số âm, sẽ xuất hiện lỗi.

Hàm encapsulatedMsg() trả về một con trỏ trỏ tới message được đóng gói, nếu giá trị trả về bằng NULL có nghĩa là không có message nào được đóng gói.

Đóng gói nhiều message

Lớp cMessage không trực tiếp hỗ trợ việc thêm nhiều hơn một message vào một đối tượng message (message object), nhưng bạn có thể tạo một lớp con của lớp cMessage và thêm vào các chức năng cần thiết.

Bạn cũng có thể đặt nhiều message trong một mảng có kích thước cố định hoặc một mảng cấp phát động, hoặc bạn có thể sử dụng một số lớp STL như std::vector hay std::list. Tuy nhiên có một điểm mà bạn cần lưu ý khi sử dụng các lớp này đó là: lớp message của bạn phải chiếm quyền sở hữu của các message được thêm vào, và phải

void MessageBundleMessage::removeMessage(cMessage *msg) {

messages.remove(msg); // remove pointer drop(msg); // release ownership

}

Bạn cũng cần phải thêm vào một hàm operator=() để đảm bảo các đối tượng message của bạn có thể được sao chép hoặc nhân đôi (đây là những điều rất cần thiết trong quá trình mô phỏng).

Một phần của tài liệu Omnet và các ứng dụng (Trang 62 - 63)