Hoàng Đăng Hải Học Viên: Lê Đăng Phong [1-22] Vũ Anh Tuấn



tải về 0.59 Mb.
trang17/19
Chuyển đổi dữ liệu13.08.2016
Kích0.59 Mb.
#17954
1   ...   11   12   13   14   15   16   17   18   19

9.6. Tạo một agent mới


Để tạo một agent mới, ta thực hiện như sau:

1. quyết định cấu trúc kế thừa của nó (Section 10.6.1), và tạo các định nghĩa lớp thích hợp,

2. định nghĩa các phương thức recv() và timeout() (Section 10.6.2),

3. định nghĩa các lớp định thời cần thiết,

4. định nghĩa các hàm liên kết trong OTcl (Section 10.6.3),

5. viết mã OTcl cần thiết để truy nhập agent (Section 10.6.4).


9.6.1. Ví dụ: Yêu cầu “ping” (Cấu trúc kế thừa)


Việc quyết định chọn cấu trúc kế thừa là một vấn đề cá nhân nhưng có vẻ liên quan đến lớp tại đó agent hoạt động, giả thiết lớp phía dưới đã hoạt động. Dạng đơn giản nhất của agent, chuyển datagram không kết nối, là lớp cơ sở Agent/UDP. Bộ tạo lưu lượng có thể dễ dàng kết nối tới các agent UDP. Đối với các giao thức muốn sử dụng việc chuyển dòng dữ liệu có kết nối (như TCP), phải sử dụng các agent TCP khác. Cuối cùng, nếu một giao thức vận chuyển mới hoặc “vận chuyển con” được phát triển, thì việc sử dụng agent làm lớp cơ sở có vẻ là lựa chọn tốt nhất. Trong ví dụ sau đây, ta dùng agent làm lớp cơ sở, với giả thiết rằng ta xây dựng một agent thuộc về lớp IP (hoặc ngay phia strên nó).

Ta có thể sử dụng các định nghĩa lớp sau đây:

class ECHO_Timer;

class ECHO_Agent : public Agent {

public:

ECHO_Agent();



int command(int argc, const char*const* argv);

protected:

void timeout(int);

void sendit();

double interval_;

ECHO_Timer echo_timer_;

};

class ECHO_Timer : public TimerHandler {



public:

ECHO_Timer(ECHO_Agent *a) : TimerHandler() {a_ = a; }

protected:

virtual void expire(Event *e);

ECHO_Agent *a_;

};

9.6.2. Các phương thức recv() và timeout()


Phương thức recv() không được định nghĩa ở đây, bởi vì nó biểu diễn một hàm yêu cầu và nó sẽ không nhận các sự kiện hay packets1. Do phương thức recv() không được định nghĩa nên phải sử dụng bản lớp cơ sở (Connector::recv()). Phương thức timeout() được sử dụng để định kỳ gửi các gói yêu cầu. Phương thức timeout() được sử dụng cùng với sendit():

void ECHO_Agent::timeout(int)

{

sendit();



echo_timer_.resched(interval_);

}

void ECHO_Agent::sendit()



{

Packet* p = allocpkt();

ECHOHeader *eh = ECHOHeader::access(p->bits());

eh->timestamp() = Scheduler::instance().clock();

send(p, 0); // Connector::send()

}

void ECHO_Timer::expire(Event *e)



{

a_->timeout(0);

}

Phương thức timeout() được tính toán để sendit() hoạt động sau mỗi interval_ seconds. Phương thức sendit() tạo ra một gói mới với các trường header của gói đã được thiết lập bởi allocpkt(). Gói không có dấu thời gian hiện thời. Cuộc gọi đến access() tạo ra một giao diện có cấu trúc cho các trường header của gói và nó được sử dụng để thiết lập trường dấu thời gian. Chú ý rằng agent này sử dụng header đặc biệt cuả chính nó (“ECHOHeader”). Việc tạo và sử dụng các header gói được mô tả trong chương sau (Chapter 12); để gửi gói đến nút ngay phía dưới, tiến hành gọi Connector::send() không cần điều khiển (handler).


9.6.3. Liên kết agent “ping” với OTcl


Ta đã có các phương thức và cơ chế để thiết lập liên kết trong OTcl (Chapter 3). Phần này tóm lại các đặc tính cơ bản của chương trước, và mô tả các chức năng tối thiểu để tạo agent ping.

Có 3 hạng mục ta phải điều khiển liên kết agent với Otcl. Đầu tiên ta cần phải thiết lập một ánh xạ giữa tên OTcl cho lớp và đối tượng thật được tạo ra khi lớp đựoc yêu cầu trong OTcl. Việc này được thực hiện như sau:

static class ECHOClass : public TclClass {

public:


ECHOClass() : TclClass("Agent/ECHO") {}

TclObject* create(int argc, const char*const* argv) {

return (new ECHO_Agent());

}

} class_echo;



Ở đây, một đối tượng tĩnh “class_echo” đã được tạo ra. Hàm khởi tạo của nó (được thực hiện ngay khi bộ mô phỏng chạy) đặt tên lớp “Agent/ECHO” vào không gian tên OTcl. Định nghĩa của phương thức create() quy định cách đối tượng bóng C++ được tạo ra khi trình biên dịch OTcl được chạy để tạo ra một đối tượng của lớp “Agent/ECHO”. Trong trường hợp này, nó trả về một đối tượng được cấp phát động. Đây là cách thông thường để tạo ra một đối bóng C++ mới.

Khi đã có một đối tượng mới, ta muốn liên kết các biến bộ phận C++ với các biến tương ứng trong không gian tên OTcl, như vậy việc truy nhập các biến OTcl thực tế là các biến bộ phận trong C++. Giả thiết ta muốn OTcl điều chỉnh khoảng thời gian gửi và kích thước gói. Việc này được hoàn thành trong hàm khởi tạo lớp:

ECHO_Agent::ECHO_Agent() : Agent(PT_ECHO)

{

bind_time("interval_", &interval_);



bind("packetSize_", &size_);

}

Ở đây, các biến C++ interval_ và size_ được liên kết với các biến OTcl tương ứng interval_ và packetSize_. Bất cứ thao thác đọc hay thay đổi đối với các biến OTcl nào cũng sẽ tạo ra trong một truy nhập tương ứng đến các biến C++. Chi tiết của các phương thức bind() đã được mô tả ở trên (Section 3.4.2). Hằng PT_ECHO bị hàm khởi tạo Agent() bỏ qua nên phương thức Agent::allocpkt() có thể thiết lập trường kiểu gói (Section 22.5). Trong trường hợp này, PT_ECHO biểu diễn một kiểu gói mới và phải định nghĩa trong ~ns/trace.h (Section 22.4).



Khi đối tượng đã được tạo ra và việc liên kết biến đã được thực hiện, ta có thể muốn tạo ra các phương thức thực hiện trong C++ mà có thể gọi từ OTcl (Section 3.4.4). Các phương thức này điều khiển các chức năng khởi tạo, huỷ hoặc thay đổi. Trong ví dụ này, ta có thể khởi động agent từ OTcl sử dụng lệnh “start”. Thực hiện như sau:

int ECHO_Agent::command(int argc, const char*const* argv)

{

if (argc == 2) {



if (strcmp(argv[1], "start") == 0) {

timeout(0);

return (TCL_OK);

}

}



return (Agent::command(argc, argv));

}

Ở đây, phương thức start() sẵn sàng để OTcl gọi hàm bộ phận C++ timeout(), hàm này khởi tạo việc tạo gói đầu tiên và định trình gói tiếp theo. Chú ý rằng lớp này rất đơn giản, nó thậm chí không có cách dừng lại.


9.6.4. Sử dụng agent nhờ OTcl


Agent ta tạo ra phải được gắn với một nút. Chú ý rằng nút và đối tượng mô phỏng được giả thiết là đã được tạo rồi. Đoạn mã OTcl sau đây biểu diễn các chức năng này:

set echoagent [new Agent/ECHO]

$simulator attach-agent $node $echoagent

Để thiết lập khoảng thời gian và kích thước gói, và bắt đầu tạo gói, thực hiện đoạn mã sau:

$echoagent set dst_ $dest

$echoagent set fid_ 0

$echoagent set prio_ 0

$echoagent set flags_ 0

$echoagent set interval_ 1.5

$echoagent set packetSize_ 1024

$echoagent start

Như vậy agent sẽ tạo ra 1 gói 1024-byte chuyển đến nút $dest sau mỗi 1.5s.



Каталог: Hoc%20Tap -> Cong%20Nghe%20Wan
Hoc%20Tap -> Point to Point Protocol (ppp) ppp được xây dựng dựa trên nền tảng giao thức điều khiển truyền dữ liệu lớp cao (High-Level Data link Control (hdlc)) nó định ra các chuẩn cho việc truyền dữ liệu các giao diện dte và dce của mạng wan như V
Hoc%20Tap -> Cấu hình Application Port-Mapping với cbac mục tiêu: Cấu hình để router nhận ra các ứng dụng không sử dụng port chuẩn. Mô hình
Hoc%20Tap -> ĐẢng cộng sản việt nam đẢng ủy phưỜng 04
Hoc%20Tap -> CiR = Bc / Tc
Hoc%20Tap -> Mean command : ip ospf mtu-ignore Diagram : Problems
Hoc%20Tap -> R1# ip route 0 0 0 0 FastEthernet0/0 R2# show run
Cong%20Nghe%20Wan -> Câu hỏi về kết nối chi nhánh về Head Office dùng wan
Cong%20Nghe%20Wan -> 1/ Cáp đồng gshdsl
Cong%20Nghe%20Wan -> 1. xu hưỚng chuẩn hoá VÀ CẤu trúc giao thứC

tải về 0.59 Mb.

Chia sẻ với bạn bè của bạn:
1   ...   11   12   13   14   15   16   17   18   19




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương