OPNET_Modeler-core-function_第1頁
OPNET_Modeler-core-function_第2頁
OPNET_Modeler-core-function_第3頁
OPNET_Modeler-core-function_第4頁
OPNET_Modeler-core-function_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、OPNET Modeler核心函數(shù)42目錄1. 核心函數(shù)簡介31.1 命名規(guī)則31.2 參數(shù)類型31.2.1 Animation Entity41.2.2 Boolean41.2.3 Compcode41.2.4.Distribution41.2.5 Event Handle41.2.6 Statistic Handle41.2.7 ICI41.2.8 List51.2.9 Object ID51.2.10 Packet51.2.11 Memory Object Type51.2.12 Log Handle51.2.13 Procedure51.2.14 Process Handle51.2.

2、15 Sar Buffer Handle51.2.16 Vartype61.3 多線程安全72. 基本核心函數(shù)72.1 內(nèi)部模型訪問函數(shù)集72.2 分布函數(shù)集102.3 進(jìn)程函數(shù)集122.4 事件函數(shù)集152.5 仿真函數(shù)集162.6 鑒定函數(shù)集172.7 拓?fù)浜瘮?shù)集182.8 接口控制信息函數(shù)集232.9 中斷函數(shù)集262.10 包函數(shù)集312.11 子隊列函數(shù)集382.12 統(tǒng)計量函數(shù)集401. 核心函數(shù)簡介1.1 命名規(guī)則OPNET中的核心函數(shù)具有非常標(biāo)準(zhǔn)的命名規(guī)則,以增強函數(shù)在C/C+代碼中的可視性,避免名稱與非OPNET函或變量沖突。以下列出了一些簡單的命名規(guī)則:名稱均采用op_作為

3、前綴,以標(biāo)識其為OPNET仿真內(nèi)核提供的核心函數(shù)。函數(shù)名的第二部分為函數(shù)集名,用小寫字母表示,通常是函數(shù)所處理對象的名稱縮寫,如pk、ici、stat等。函數(shù)名的第三部分是子函數(shù)集名,對核心函數(shù)進(jìn)一步進(jìn)行了分類,如核心函數(shù)op_pk_nfd_set()中的nfd。核心函數(shù)主要用于對對象的操作。在函數(shù)名中,對象總是出現(xiàn)在動作之前,比如名稱中的attr_set和subq_flush就將對象(attribute和subqueue)放在動作(set和flush)之前。1.2 參數(shù)類型大部分核心函數(shù)的參數(shù)和返回值都是標(biāo)準(zhǔn)的C/C+數(shù)據(jù)類型,如int、double、char*。除此之外,在仿真數(shù)據(jù)結(jié)構(gòu)中還

4、通過C/C+的typedef語句定義了許多參數(shù)和返回值作為特殊的OPNET數(shù)據(jù)類型。盡管用戶通過核心函數(shù)來操作OPNET數(shù)據(jù)類型,可能對每個數(shù)據(jù)類型的基本內(nèi)容都越來越熟悉,但用戶并不需要關(guān)心數(shù)據(jù)類型確切的內(nèi)部結(jié)構(gòu),因為OPNET仿真數(shù)據(jù)結(jié)構(gòu)的內(nèi)容因軟件版本的不同而有所改變。表1-1列舉了部分特殊的數(shù)據(jù)類型。表1-1 OPNET中部分特殊數(shù)據(jù)類型基本數(shù)據(jù)類型聲明示例Anvid (viewer ID)Anvid vid;Anmid (macro ID)Anmid mid;Andid (drawing ID)Andid did;BooleanBoolean bool;CompcodeCompcode

5、 comp_status;DistributionDistribution* dist_ptr;EvhandleEvhandle evh;StathandleStathandle Stat_handle;IciIci* ici_ptr;ListList* list_ptr;ObjidObjid objid;PacketPacket* pkptr;PmohandlePmohandle pmh;Log_HandleLog_Handle config_log_hndl;ProcedureProcedure proc;ProhandleProhandle proh;SbhandleSbhandle s

6、bh;1.2.1 Animation Entity動畫集由操作中特定動畫實體的ID號表示。之所以采用ID號來代替中的指針,是因為對于動畫觀察函數(shù)op_vuanim,ID號通信超過了仿真范圍。盡管ID號只是存儲在規(guī)則的C/C+整型變量中的簡單整數(shù)值,但OPNET也聲明了特定的數(shù)據(jù)類型來準(zhǔn)確標(biāo)記ID參數(shù)和變量。三種基于ID號的動畫實體包括瀏覽器(Viewer)、宏(Macro)和圖畫(Drawing)。1.2.2 Boolean核心函數(shù)通過返回布爾值來表示結(jié)果是否正確。布爾值可與符號常量OPC_TRUE和OPC_FALSE進(jìn)行比較。1.2.3 Compcode核心函數(shù)通過返回Compcode值來表

7、示操作是否正確完成。Compcode的值可與符號常量OPC_COMPCODE_SUCCESS和OPC_COMPCODE_FAILURE進(jìn)行比較。1.2.4.DistributionDistribution是一種與概率密度函數(shù)(PDF)一致的數(shù)據(jù)結(jié)構(gòu),它描述了隨機數(shù)到特定數(shù)字輸出的映射。Distribution包含一張對映射進(jìn)行編碼的數(shù)字表,指出完成該映射的算法。對于基于表格的Distribution,數(shù)據(jù)從PDF編輯器的PDF模型文件中讀入。這些結(jié)構(gòu)均由Dist函數(shù)集中核心函數(shù)操作。1.2.5 Event Handle事件句柄是惟一一種確定未決仿真事件(中斷)的數(shù)據(jù)結(jié)構(gòu)。該結(jié)構(gòu)主要在Intrp

8、t核心函數(shù)集中使用,因此可通過它們處理預(yù)設(shè)的中斷。注意,事件句柄是一種數(shù)據(jù)結(jié)構(gòu),而不是整型或指針。因此不能把它存儲在整型或指針變量中。1.2.6 Statistic Handle統(tǒng)計量句柄是一種確定動態(tài)產(chǎn)生的全局和局部統(tǒng)計量的數(shù)據(jù)結(jié)構(gòu)。統(tǒng)計量句柄的數(shù)據(jù)類型為Stathandle,獲得統(tǒng)計量句柄的惟一方法是通過核心函數(shù)的Stat函數(shù)集來注冊統(tǒng)計量。注冊統(tǒng)計量時將為其指定一個惟一的名稱,并和時間一起存儲在一個輸出矢量中。局部統(tǒng)計量用在特定處理器或隊列中;全局統(tǒng)計量由仿真模型中的實體共享,每個實體分布式地作用于輸出矢量。1.2.7 ICIICI(Interface Control Informati

9、on,接口控制信息)是與仿真中斷相關(guān)的結(jié)構(gòu)化數(shù)據(jù)的集合用于進(jìn)程間通信機制,傳輸分層協(xié)議接口的控制信息。ICI由ici函數(shù)集中的核心函數(shù)操作。1.2.8 ListList是存儲在雙向鏈表中的數(shù)據(jù)元素的集合。List中的元素可按照從簡單的C/C+數(shù)據(jù)類型在復(fù)雜的數(shù)據(jù)結(jié)構(gòu)進(jìn)行排列。List主要用于臨時存儲數(shù)據(jù)結(jié)構(gòu)組,可包含各種不同類型的元素,但通常并不這樣使用。對List的大小沒有限制,可在其任意位置插入或移除元素。List由Prg函數(shù)集的List子函數(shù)集操作。1.2.9 Object ID對像ID惟一地確定了一個仿真對象。通過使用Objid數(shù)據(jù)類型聲明該標(biāo)識符,供Id、Ima、Topo和Pk函數(shù)集

10、使用。1.2.10 PacketPacket是數(shù)據(jù)封裝和傳輸建模中的基本仿真實體。它由Pk函數(shù)集中的核心函數(shù)操作。1.2.11 Memory Object Type某些建模需要為其動態(tài)分配內(nèi)存來存儲各種信息。每個相同大小數(shù)據(jù)組成的集合記為一個池,內(nèi)核為每個池分配大量的數(shù)據(jù)條目以提高標(biāo)準(zhǔn)內(nèi)存分配器的效率。每個匯聚池中的內(nèi)存對象必須通過調(diào)用核心函數(shù)op_prg_pmo_define()來創(chuàng)建,該函數(shù)將返回一個匯聚內(nèi)存對象句柄來標(biāo)識池,用Pmohandle表示。創(chuàng)建匯聚內(nèi)存對象時都為其分配了一個惟一的名稱,仿真模型中的實體可以共享匯聚內(nèi)存對象。1.2.12 Log Handle當(dāng)在仿真調(diào)試或數(shù)據(jù)分析

11、中創(chuàng)建仿真日志時,日志句柄對于每個日志項非常必要。 1.2.13 Procedure某些核心函數(shù)將C/C+函數(shù)指針作為參數(shù),但并不聲明這些參數(shù)作為指向返回整型值的函數(shù)的指針,而是定義了一種特殊的數(shù)據(jù)類型Procedure。1.2.14 Process Handle進(jìn)程句柄是惟一一種標(biāo)識仿真中活動進(jìn)程的數(shù)據(jù)結(jié)構(gòu),由Pro函數(shù)集中的核心函數(shù)使用。需注意進(jìn)程句柄是數(shù)據(jù)結(jié)構(gòu),而不是整形或指針,因而不能將它們存儲在整型或指針變量中。1.2.15 Sar Buffer HandleSar緩沖句柄是惟一一種標(biāo)識Sar(Segmentation & Reassembly,分段與重組)緩沖區(qū)的數(shù)據(jù)結(jié)構(gòu)。

12、Sar緩沖區(qū)緩存包序列,并可對包進(jìn)行分段和重裝。Sar緩沖區(qū)由Sar函數(shù)集中的核心函數(shù)創(chuàng)建,該函數(shù)返回訪問新緩沖區(qū)的Sar緩沖句柄。Sar函數(shù)集函數(shù)利用Sar緩沖名柄來處理被標(biāo)識的Sar緩沖區(qū)。與其他OPNET數(shù)據(jù)結(jié)構(gòu)一樣,不能將Sar緩沖句柄分配到整型或指針變量中。1.2.16 Vartype除標(biāo)準(zhǔn)的C/C+數(shù)據(jù)類型和特殊的仿真內(nèi)核數(shù)據(jù)類型外,OPNET還提供了另外一種數(shù)據(jù)類型Vartype。Vartype數(shù)據(jù)類型可用在變量聲明或類型轉(zhuǎn)換語句中,它是OPNET文檔中的特殊關(guān)鍵詞,表示函數(shù)參數(shù)可以是多種可能的數(shù)據(jù)類型之一。類型參數(shù)的傳遞由C描述的調(diào)用函數(shù)確定,Vartype用于確定哪個函數(shù)參數(shù)

13、可用來傳遞多種數(shù)據(jù)類型。但需要注意的是,Vartype并不像C中的varargs那樣可傳遞多種參數(shù),每個Vartype參數(shù)一次只能接受一個傳遞值。Vartype類型的參數(shù),可接受int、double或指向數(shù)據(jù)結(jié)構(gòu)的指針。Vartype*是Vartype的一種變體,它可接受指向變量類型的指針。Vartype*類型的參數(shù)可接受的值包括:指向整型的指針、指向double的指針、指向數(shù)據(jù)結(jié)構(gòu)的指針,或參數(shù)用于返回filled-in值時指向數(shù)據(jù)結(jié)構(gòu)指針的指針。每個核心函數(shù)中都描述了可被Vartype或Vartype*參數(shù)接受的類型值。具有該類型參數(shù)的部分核心函數(shù)如表1-2所示。表1-2 帶Vartype

14、參數(shù)的核心函數(shù)核心函數(shù)變量類型參數(shù)op_ima_obj_attr_set()Vartypeop_ima_obj_attr_get()Vartype* (fill-in)op_pk_fd_set()Vartypeop_pk_fd_get()Vartype* (fill-in)op_pk_nfd_set()Vartypeop_pk_nfd_get()Vartype* (fill-in)op_ini_attr_set()Vartypeop_ini_attr_get()Vartype* (fill-in)op_prg_list_insert()Vartype*op_prg_mem_copy()Vart

15、ype*op_prg_mem_free()Vartype*返回變量類型參數(shù)的部分核心函數(shù)如表1-3所示。表1-3 返回變量類型參數(shù)的核心函數(shù)核心函數(shù)變量類型參數(shù)op_prg_list_access()Vartype*op_prg_list_remove()Vartype*op_prg_mem_alloc()Vartype*表1-4 易沖突的函數(shù)名accept()index()send()access()kill()signal()audit()link()socket()bind()listen()stat()clear()open()tell()clock()pipe()truncate()

16、close()poll()unlink()connect()read()wait()exit()select()1.3 多線程安全無線模塊允許OPNET采用多處理器進(jìn)行收/發(fā)信機管道計算。為確保并行傳輸?shù)恼_性和盡可能快速,五個管道階段必須采用多線程安全核心函數(shù)。核心函數(shù)定義了三個多線程安全級別,分別是MT-safe、MT-unsafe和Forced serialization。(1)MT-safe:該類核心函數(shù)已手動進(jìn)行重編碼以支持多線程。多個線程可安全地并行執(zhí)行該類核心函數(shù)。(2)MT-unsafe:在該安全級別下,若在核心函數(shù)中采用并行處理,將導(dǎo)致性能的下降,達(dá)不到預(yù)期的結(jié)果。使用MT-

17、unsafe核心函數(shù)時,應(yīng)當(dāng)執(zhí)行適當(dāng)?shù)拇a序列化(Serialization)。(3)Forced serialization:對于所有已手動重編碼以支持多線程的核心函數(shù),仿真內(nèi)核采用內(nèi)部互斥來執(zhí)行嚴(yán)格的序列化。最終每個核心函數(shù)將進(jìn)行手動重編碼來支持多線程,它們的狀態(tài)也將由Forced serialization變?yōu)镸T-safe。2. 基本核心函數(shù)OPNET Modeler10.0提供了21個核心函數(shù)集,只有熟悉核心函數(shù)才能在建模時方便地進(jìn)行代碼編寫。本節(jié)按照不同的功能對常用的核心函數(shù)作了詳細(xì)的介紹。2.1 內(nèi)部模型訪問函數(shù)集Ima(Internal Model Access,內(nèi)部模型訪問)

18、函數(shù)集是一系列提供對仿真實體動態(tài)訪問的核心函數(shù)的集合,其中仿真實體包括仿真屬性、對象屬性、對象命令(Object Command)和進(jìn)程狀態(tài)變量。1. op_ima_obj_attr_get (objid,attr_name,value_ptr)此核心函數(shù)的作用是獲取給定對象的某屬性值,其參數(shù)說明如表2-1所示。表2-1 op_ima_obj_attr_get()函數(shù)的參數(shù)說明參 數(shù)類 型描 述objidObjid給定對象的對象IDattr_nameconst char*屬性名(必須是給定對象中已定義的,否則將出錯)value_ptrVartype*指向存儲屬性值變量的指針(Vartype*

19、可接受字符串或指向整型 、double以及復(fù)合屬性對象ID指針。當(dāng)為字符串時,字符數(shù)組必須足夠大,以容納屬性值。參數(shù)指針類型必須與給定屬性的數(shù)據(jù)類型相匹配,否則將出錯。如果屬性類型是toggle,返回值即為OPC_BOOLINT_ENABLED或OPC_BOOLINT_DISABLED;如果屬性類型是pofile,返回值即為包含訪問profile所需的必要信息的pofile specification(PrgT_Profile_Spec) 1)返回值Compcode如果成功獲取屬性值,即返回OPC_COMPCODE_SUCCESS,否則返回OPC_COMPCODE_FAILURE。如果需要獲取

20、給定對象的復(fù)合屬性值,則若復(fù)合屬性相等,value_ptr的值即設(shè)為復(fù)合屬性中的一個對象ID,并返回OPC_COMPCODE_SUCCESS;若不相等,則返回OPC_COMPCODE_FAILURE。注意:在復(fù)合屬性中,所謂的“相等”,是指復(fù)合屬性中的所有屬性都具有相同的名稱、類型和值,并且復(fù)合屬性的所有子對象也相等。2)詳解對于網(wǎng)絡(luò)域?qū)ο螅ㄗ泳W(wǎng)、節(jié)點和鏈路)、節(jié)點域?qū)ο螅K)以及預(yù)先由網(wǎng)絡(luò)、節(jié)點、進(jìn)程或鏈路編輯器定義的復(fù)合屬性,都可以獲取對象屬性值。提升的屬性值可以從父對象中獲取。要引用提升屬性,必須為每個中間對象的屬性名附加一個點分前綴。例如,若要在節(jié)點級獲取進(jìn)程屬性,則屬性名應(yīng)在包含該

21、進(jìn)程的模塊名稱之前。并不是所有的對象屬性都可仿真中調(diào)用該函數(shù)來獲取。比如Simulation/Access字段被標(biāo)記為N/A的屬性就不能通過調(diào)用op_ima_obj_attr_get()來獲取。此外,該核心函數(shù)的命令級別為Forced serialization。3)目的該函數(shù)提供了一種在仿真中動態(tài)獲取對象屬性的機制。它可用于處理器或隊列確定自身或網(wǎng)絡(luò)中其它對象的屬性值。將該函數(shù)與op_ima_obj_attr_set()結(jié)合,無需包、ICI或中斷遞送就可提供遠(yuǎn)程進(jìn)程間的通信。4)錯誤Program Abort:分段錯誤(由無效值指針、指針?biāo)竷?nèi)存不足或指向無效的attr_name地址所引起)

22、。Recoverable Error:對象無法識別屬性名。Recoverable Error:對象ID溢出。Recoverable Error:對象ID指向受限對象(由受護模型中的相關(guān)對象引起)。5)相關(guān)函數(shù)采用op_ima_obj_attr_set()、op_ima_obj_attr_set_db1()、op_ima_obj_attr_set_int32()和op_ima_obj_attr_set_str()設(shè)置對象屬性值。采用op_ima_sim_attr_get()、op_ima_sim_attr_get_db1()、op_ima_sim_attr_get_int32()和op_ima_

23、sim_attr_get_str()獲取仿真屬性值。采用op_ima_obj_svar_get()獲取進(jìn)程狀態(tài)變量值。采用op_ima_obj_command()向?qū)ο蟀l(fā)出一個命令。采用op_id_self()獲取所屬處理器或隊列的對象ID。采用op_id_from_name()獲取對象的對象ID。2. op_ima_obj_attr_set (objid,attr_name,value_ptr)此核心函數(shù)的作用是設(shè)置給定對象的某屬性值,其參數(shù)說明如表2-2所示。表2-2 op_ima_obj_attr_set()函數(shù)的參數(shù)說明參 數(shù)類 型描 述objidObjid給定對象的對象IDattr_

24、nameconst char*屬性名value_ptrVartype*指定屬性需設(shè)置的新值1)返回值Compcode如果成功獲取屬性值,即返回OPC_COMPCODE_SUCCESS,否則返回OPC_COMPCODE_FAILURE。2)詳解對于網(wǎng)絡(luò)域?qū)ο螅ㄗ泳W(wǎng)、節(jié)點和鏈路)、節(jié)點域?qū)ο螅K)以及預(yù)先由網(wǎng)絡(luò)、節(jié)點、進(jìn)程或鏈路編輯器定義的復(fù)合屬性,都可以設(shè)置對象屬性值。在對象中可以設(shè)置提升對象的值。并不是所有的對象屬性都可仿真中調(diào)用該函數(shù)來設(shè)置。比如Simulation/Access字段被標(biāo)記為N/A的屬性就不能通過調(diào)用op_ima_obj_attr_set()來設(shè)置。此外,該核心函數(shù)的命令級

25、別為Forced serialization。3)目的該核心函數(shù)提供了一種在仿真過程中動態(tài)設(shè)置對象屬性的機制,可用于處理器或隊列控制其他模塊。與函數(shù)op_ima_obj_attr_get()結(jié)合,無需包、ICI或中斷遞送就可提供遠(yuǎn)程進(jìn)程間的通信。不過需要注意的是,遠(yuǎn)端對象值的改變并不會引起中斷,只是當(dāng)修改后的對象再次調(diào)用函數(shù)op_ima_obj_attr_get()獲取其屬性時才會產(chǎn)生影響。4)錯誤Program Abort:分段錯誤(由無效值指針、attr_name地址無效或值類型錯誤所引起)。Recoverable Error:對象無法識別屬性名。Recoverable Error:對象I

26、D溢出。Recoverable Error:對象屬性為只讀。Recoverable Error:屬性值無效。Recoverable Error:對象ID指向受限對象。5)相關(guān)函數(shù)采用op_ima_obj_attr_get()、op_ima_obj_attr_get_db1()、op_ima_obj_attr_get_int32()和op_ima_obj_attr_get_str()設(shè)置對象屬性值。采用op_ima_sim_attr_get()、op_ima_sim_attr_get_db1()、op_ima_sim_attr_get_int32()和op_ima_sim_attr_get_st

27、r()獲取仿真屬性值。采用op_ima_obj_svar_get()獲取進(jìn)程狀態(tài)變量值。采用op_ima_obj_command()向?qū)ο蟀l(fā)出一個命令。采用op_id_self()獲取所屬處理器或隊列的對象ID。采用op_id_from_name()獲取對象的對象ID。3. op_ima_sim_attr_get (attr_type, attr_name, value_ptr)此核心函數(shù)的作用是獲取仿真屬性值,其說明如表2-3所示。表2-3 op_ima_sim_attr_get()函數(shù)的參數(shù)說明參 數(shù)類 型描 述attr_typeint屬性類型(可以為OPC_IMA_INTEGER、OPC

28、_IMA_DOUBLE、OPC_IMA_TOGGLE或OPC_IMA_STRING)attr_nameconst char*屬性名value_ptrVartype*指定存儲屬性值變量的指針1)返回值Compcode如果成功獲取屬性值,即返回OPC_COMPCODE_SUCCESS,否則返回OPC_COMPCODE_FAILURE。2)詳解仿真屬性與子網(wǎng)發(fā)屬性、節(jié)點屬性、模塊屬性以及進(jìn)程屬性均不同,它不在制定模塊規(guī)范階段定義,而在仿真運行期間動態(tài)定義。仿真屬性是通過一些環(huán)境屬性機制來進(jìn)行賦值的,包括仿真命令行、環(huán)境數(shù)據(jù)庫(<HOME>/op_admin/env_db<rel&g

29、t;)、shell變量或環(huán)境文件。該函數(shù)將觸發(fā)仿真的內(nèi)部環(huán)境數(shù)據(jù)庫掃描可用值,如果無法在現(xiàn)有程序環(huán)境中為仿真屬性找到一個值,那么它將在標(biāo)準(zhǔn)輸出設(shè)備上打印一個提示(可用仿真的noprompt環(huán)境屬性來取消用戶提示),請求輸入一個值。一旦提示出現(xiàn),就將打印一個屬性的默認(rèn)值。注意:默認(rèn)值是調(diào)用核心函數(shù)時傳遞給參數(shù)的value_ptr值,而不使用進(jìn)程模型屬性列表中的默認(rèn)初始值。因此在調(diào)用該函數(shù)時,必須事先定義value_ptr。如果在仿真程序環(huán)境中能夠找到給定屬性,或當(dāng)提升時值時被顯示輸入,那么認(rèn)為函數(shù)執(zhí)行成功并返回值OPC_COMPCODE_SUCCESS。如果內(nèi)核必須要引用value_ptr的值,

30、則返回OPC_COMPCODE_FAILURE。3)目的該核心函數(shù)提供了一種獲取在仿真運行期間設(shè)置的仿真屬性的機制。將該函數(shù)與用環(huán)境屬性來分配仿真屬性結(jié)合起來,不僅可以獲取網(wǎng)絡(luò)范圍內(nèi)的關(guān)鍵參數(shù),還可獲取影響進(jìn)程邏輯操作的進(jìn)程級參數(shù)。4)錯誤Program Abort:分段錯誤(由無效值指針、指針?biāo)竷?nèi)存不足或指向畸形的attr_name參數(shù)引起)。Program Abort:內(nèi)存分配失敗。Recoverable Error:屬性類型不可識別。5)相關(guān)函數(shù)采用op_ima_obj_attr_get()、op_ima_obj_attr_get_db1()、op_ima_obj_attr_get_i

31、nt32()和op_ima_obj_attr_get_str()設(shè)置對象屬性值。采用op_ima_sim_attr_set()、op_ima_sim_attr_set_db1()、op_ima_sim_attr_set_int32()和op_ima_sim_attr_set_str()設(shè)置對象屬性值。采用op_ima_obj_svar_get()獲取進(jìn)程狀態(tài)變量值。采用op_ima_obj_command()向?qū)ο蟀l(fā)出一個命令。2.2 分布函數(shù)集Dist(Distribution)函數(shù)集是一系列根據(jù)特定概率分布產(chǎn)生隨機值的核心函數(shù)集合。只要具有隨機行為的仿真都可以使用這些隨機值中的一種或幾種,

32、如計算中斷的到達(dá)時間、產(chǎn)生通信量目的地址或確定節(jié)點是否應(yīng)被去激活等。1. op_dist_load (dist_name, dist_arg0, dist_arg1)此核心函數(shù)的作用是加載分布以產(chǎn)生隨機值流,其參數(shù)說明如表2-4表2-4 op_dist_load()函數(shù)的參數(shù)說明參 數(shù)類 型描 述dist_nameconst char*被加載的分布名稱,通常為字符串常量dist_arg0double分布的附加參數(shù)#0dist_arg1double分布的附加參數(shù)#11)返回值Distribution *指向被加載分布的指針。如果發(fā)生可恢復(fù)錯誤,則返回常量OPC_NIL。函數(shù)返回值一般存儲在Dis

33、tribution *類型的狀態(tài)變量中,稍后現(xiàn)傳遞給相關(guān)核心函數(shù) op_dist_outcome()。2)詳解分布是根據(jù)名稱來確定的,可以是預(yù)定義的分析分布、采用PDF編輯器建立的用戶自定義PDF模型或EMA-specified PDF模型。執(zhí)行預(yù)定義的分布可以看作是通過一兩個數(shù)值參數(shù)調(diào)用該核心函數(shù)的參數(shù)化算法。另外兩種類型的分布是后綴為“.pd.s”的表格式數(shù)據(jù)文件,調(diào)用該函數(shù)時將其加載到內(nèi)存中。需要注意的是,即使預(yù)定義的分布在models/std/base文件夾中有相應(yīng)的“.pd.s”文件,但這些文件都是零字節(jié)的,不包含任何分布信息,只是讓分布能夠顯示在OPNET菜單中。當(dāng)加載用戶自定義的

34、PDF時,將忽略參數(shù)dist_arg0和dist_agr1。此外,該核心函數(shù)的安全級別為MT-safe。3)目的該核心函數(shù)提供作為隨機數(shù)發(fā)生器的概率分布。該函數(shù)主要用于加載分布,以在處理器產(chǎn)生的包之間提供隨機時間間隔。任何隨機分布的仿真參數(shù)都可以通過該函數(shù)來獲取。實際的隨機值是通過調(diào)用函數(shù)op_dist_outcome()來獲取的。4)錯誤Program Abort:分段錯誤(由無效分布名指針引起)。Program Abort:內(nèi)存分配失敗。Recoverable Error:分布名不可識別。5)相關(guān)函數(shù)采用op_dist_outcome()或op_dist_outcome_ext()獲取已加

35、載分布的隨機值。采用op_dist_uniform()獲取均勻分布的隨機值。采用op_dist_unload()釋放分布占用的內(nèi)存。2. op_dist_outcome (dist_ptr)此核核心函數(shù)的作用是為具有特定分布的隨機變量產(chǎn)生一個浮點數(shù),其參數(shù)說明如表2-5。表2-5 op_dist_outcome()函數(shù)的參數(shù)說明參 數(shù)類 型描 述dist_ptrDistribution*指向被加載分布的指針1)返回值double具有特定分布隨機變量的結(jié)果。如果發(fā)生可恢復(fù)錯誤,則返回常量 OPC_DBL_INVALID。2)詳解特定分布可以是預(yù)定義的算法分布,也可以是之前通過函數(shù)op_dist_

36、load()加載的數(shù)字型表格式分布。該核心函數(shù)執(zhí)行表格式分布的列表查詢,并對算法分布(如指數(shù)分布)進(jìn)行數(shù)字計算。該核心函數(shù)使用的隨機數(shù)流是調(diào)用BSD random()過程產(chǎn)生的,所有分布函數(shù)集中的函數(shù)和發(fā)生器模塊都可共享此隨機數(shù)流。隨機數(shù)流依賴于初始的種子數(shù)(seed),如果仿真輸入(包括相同的隨機seed)相同,則仿真結(jié)果可重復(fù)。此外,該核心函數(shù)的安全級別為MT-safe。3)目的該核心函數(shù)提供了一種獲取符合某概率分布的隨機值的機制。該函數(shù)學(xué)用于計算處理器產(chǎn)生的包之間的隨機時間間隔。任何隨機分布的仿真參數(shù)都可以通過它來獲取。4)錯誤Program Abort:分段錯誤(由無效分布指針引起)。

37、Recoverable Error:分布指針為NIL。5)相關(guān)函數(shù)采用op_dist_load()加載分布。采用op_dist_uniform()獲取均勻分布的隨機值。采用op_dist_unload()釋放分布占用的內(nèi)存。采用op_dist_outcome_ext()獲取用戶自定義的隨機數(shù)發(fā)生器產(chǎn)生的隨機數(shù)。采用op_intrpt_schedule_self()、op_intrpt_schedule_remote()或op_intrpt_schedule_call()分別產(chǎn)生自中斷、遠(yuǎn)程中斷和過程中斷。3. op_dist_uniform(limit)此核心函數(shù)的作用是產(chǎn)生一個均勻分布的隨機

38、值,其參數(shù)說明如表2-6所示。表2-5 op_dist_uniform()函數(shù)的參數(shù)說明參 數(shù)類 型描 述limitdouble均勻分布的取值范圍1)返回值double產(chǎn)生的均勻分布的隨機值,范圍在0.0,limit 中。2)詳解該核心函數(shù)使用的隨機數(shù)流是調(diào)用BSD random()過程產(chǎn)生的,所有分布函數(shù)集中的函數(shù)和發(fā)生器模塊都可共享此隨機數(shù)流。隨機數(shù)流依賴于初始的種子數(shù)(seed),如果仿真輸入(包括相同的隨機seed)相同,則仿真結(jié)果可重復(fù)。如果參數(shù)limit為負(fù)數(shù),則返回值將是一個大于limit的均勻分布的負(fù)數(shù)此外,該核心函數(shù)的安全級別為MT-safe。3)目的該核心函數(shù)為普通的建模提

39、供了一種獲取均勻分布隨機數(shù)的機制,例如可用于數(shù)據(jù)鏈路協(xié)議計算隨機超進(jìn)。4)錯誤無錯誤捕獲5)相關(guān)函數(shù)采用op_dist_load()加載一個概率分布。采用op_dist_outcome()根據(jù)已加載的概率分布,獲取一隨機值。2.3 進(jìn)程函數(shù)集進(jìn)程函數(shù)集是一系列用于在一個處理器或隊列模塊中創(chuàng)建和管理多個進(jìn)程的核心函數(shù)的集合。進(jìn)程是進(jìn)程模型的一個實例,進(jìn)程模型是在OPNET的進(jìn)程編輯器中開發(fā)的特定類型進(jìn)程的行為和功能規(guī)范。1. op_pro_create (model_name, ptc_mem_ptr)此核心函數(shù)的作用是創(chuàng)建一個新的進(jìn)程作為特定進(jìn)程模型的實例,并允許安裝parent-to-chi

40、ld共享內(nèi)存,作為當(dāng)前進(jìn)程和創(chuàng)建的子進(jìn)程間通信機制,其參數(shù)說明如表2-7所示。表2-7 op_pro_create()函數(shù)的參數(shù)說明參 數(shù)類 型描 述model_nameconst char*進(jìn)程模型名稱ptc_mem_ptrVartype*當(dāng)前進(jìn)程和被創(chuàng)建進(jìn)程共享的parent-to-child內(nèi)存塊的地址(該內(nèi)存塊格式是用戶自定義的。通常若無內(nèi)存共享,則傳遞值OPC_NIL)1)返回值Prohandle進(jìn)一步處理被創(chuàng)建子進(jìn)程的進(jìn)程句柄。2)詳解仿真內(nèi)核支持單個隊列或處理器模塊中任意多個不同類型進(jìn)程的并存。除了根進(jìn)程,其他所有進(jìn)程都通過該核心函數(shù)創(chuàng)建。只有當(dāng)提供的參數(shù)process_mode

41、l引用當(dāng)前仿真中已聲明的進(jìn)程,該核心函數(shù)才會執(zhí)行成功。在為仿真系統(tǒng)的任一處理器或隊列模塊的進(jìn)程模型屬性賦值,或在通過進(jìn)程編輯器將進(jìn)程聲明為另一進(jìn)程的子進(jìn)程時,均采用進(jìn)程模型的隱式聲明。每個通過該核心函數(shù)創(chuàng)建的進(jìn)程都可以利用共享內(nèi)存與創(chuàng)建它的進(jìn)程進(jìn)行通信。共享內(nèi)存是用戶自定義的內(nèi)存塊,其地址必須作為ptc_mem_ptr參數(shù)傳遞給該函數(shù)。此外,該核心函數(shù)的安全級別為Forced serialization。3)目的該核心函數(shù)提供了一個進(jìn)程,其可以創(chuàng)建在相同模塊中操作的子進(jìn)程。每個子進(jìn)程作為一個進(jìn)程模型實例獨立存在,并維持自身的狀態(tài)。4)錯誤Program Abort:核心函數(shù)需要進(jìn)程上下文。Pr

42、ogram Abort:無法創(chuàng)建進(jìn)程。Program Abort:進(jìn)程的描述符分配失敗。Program Abort:初始化進(jìn)程失敗。Recoverable Error:進(jìn)程模型未被聲明。5)相關(guān)函數(shù)采用op_pro_invoke()調(diào)用進(jìn)程模型。子進(jìn)程采用op_pro_parmem_access()獲取parent_to_child共享內(nèi)存。采用op_pro_id()確定進(jìn)程的惟一整數(shù)標(biāo)識符。2. op_pro_destroy_options(pro_handle, options)銷毀動態(tài)創(chuàng)建的進(jìn)程和該進(jìn)程的所有預(yù)設(shè)事件,其參數(shù)說明如表2-8所示。表2-8 op_pro_destroy_op

43、tions ()函數(shù)的參數(shù)說明參 數(shù)類 型描 述pro_handleProhandle被銷毀進(jìn)程的進(jìn)程句柄optionsint被執(zhí)行的可選操作1)返回值Compcode表示仿真內(nèi)核是否成功銷毀進(jìn)程的完成代碼,包括OPC_COMPCODE_SUCCESS和OPC_COMPCODE_FAILURE。2)詳解該函數(shù)允許進(jìn)程銷毀同一模塊中的任意其他動態(tài)進(jìn)程,因此根進(jìn)程是惟一給定模塊中不能被銷毀的進(jìn)程。此外,該函數(shù)還可移除被銷毀進(jìn)程的所有預(yù)設(shè)事件。其中,動態(tài)進(jìn)程是通過核心函數(shù)op_pro_create()創(chuàng)建的,在仿真中可隨時從模型中移除動態(tài)進(jìn)程。適當(dāng)終止進(jìn)程可釋放分配給進(jìn)程的動態(tài)內(nèi)存,但這也可能給建模

44、帶來一定影響。進(jìn)程模型在銷毀時會有一個特殊的邏輯片斷,該片斷是進(jìn)程模型的終止塊和銷毀進(jìn)程時仿真內(nèi)核直接調(diào)用的包含其中的代碼。代碼片斷中可能用到狀態(tài)和臨時變量。進(jìn)程可以銷毀自身,這時不返回任何值,除了終止塊中的特定操作外,不執(zhí)行任何操作。注意:內(nèi)核對釋放parent-to-child或參數(shù)內(nèi)存不負(fù)任何責(zé)任。該核心函數(shù)可使用的option有:OPC_PRO_DESTROY_OPT_KEEP_EVENTS核心函數(shù)移除被銷毀進(jìn)程的任意預(yù)設(shè)事件。OPC_PRO_DESTROY_OPT_NONE默認(rèn)操作。此外,該核心函數(shù)的安全級別為Forced serialization。3)目的該核心函數(shù)提供了一個進(jìn)程

45、,其可以創(chuàng)建在相同模塊中操作的子進(jìn)程。每個子進(jìn)程作為一個進(jìn)程模型實例獨立存在,并維持自身的狀態(tài)。4)錯誤Program Abort:核心函數(shù)需要進(jìn)程上下文。Program Abort: 分段錯誤(由畸形進(jìn)程句柄導(dǎo)致)。Recoverable Error:進(jìn)程句柄無效。Recoverable Error:進(jìn)程句柄指向被銷毀進(jìn)程。Recoverable Error:進(jìn)程句柄指向遠(yuǎn)程進(jìn)程。Recoverable Error:進(jìn)程句柄指向根進(jìn)程。Recoverable Error:進(jìn)程句柄指向活動進(jìn)程。5)相關(guān)函數(shù)采用op_pro_create()創(chuàng)建新的進(jìn)程并獲取其句柄。采用op_prg_mem_f

46、ree()釋放通過函數(shù)op_prg_mem_alloc()分配的內(nèi)存。采用op_pro_invoke()調(diào)用進(jìn)程模型。采用op_pro_parmem_access()用于子進(jìn)程獲取parent_to_child共享內(nèi)存。3. op_pro_self()此核心函數(shù)的作用是獲取當(dāng)前正在執(zhí)行的進(jìn)程的進(jìn)程句柄。1)返回值Prohandle當(dāng)前正在執(zhí)行的進(jìn)程的進(jìn)程句柄。在執(zhí)行與該進(jìn)程相關(guān)的操作時,調(diào)用其他核心函數(shù)時可使用此句柄。2)詳解當(dāng)前執(zhí)行的進(jìn)程通常需要使用其自身的句柄作為進(jìn)程和中斷函數(shù)集中其他核心函數(shù)的參數(shù)。例如,該句柄可作為指針來獲取父進(jìn)程的句柄。其他典型應(yīng)用包括獲取進(jìn)程的惟一ID,銷毀無用的進(jìn)

47、程本身。此外,該核心函數(shù)的安全級別為Forced serialization。3)目的該核心函數(shù)為調(diào)用該核心函數(shù)的進(jìn)程提供了一個進(jìn)程句柄,作為進(jìn)程和中斷函數(shù)集中其他核心函數(shù)的參數(shù)。4)錯誤Program Abort:核心函數(shù)需要進(jìn)程上下文。5)相關(guān)函數(shù)采用op_pro_id()獲取進(jìn)程的惟一整數(shù)ID。采用op_prg_mem_free()銷毀進(jìn)程。采用op_intrpt_port_register ()為特定流或統(tǒng)計中斷注冊一個進(jìn)程。采用op_intrpt_type_register()為特定類型中斷注冊一個進(jìn)程。4. op_pro_invoke (pro_handle, argmem_ptr

48、)該核心函數(shù)的作用是在當(dāng)前事件和當(dāng)前模塊的上下文中調(diào)用進(jìn)程。被調(diào)用進(jìn)程將被暫停直到函數(shù)返回,其參數(shù)說明如表2-9所示。表2-9 op_pro_invoke()函數(shù)的參數(shù)說明參 數(shù)類 型描 述pro_handleProhandle被調(diào)用進(jìn)程的進(jìn)程句柄argmem_ptrVartype*通過函數(shù)op_pro_argmem_access()為被調(diào)用進(jìn)程提供的參數(shù)內(nèi)存塊的地址1)返回值Compcode表示調(diào)用是否成功的完成代碼,返回代碼包括OPC_COMPCODE_SUCCESS和OPC_COMPCODE_FAILURE。進(jìn)程句柄過期或調(diào)用其他模塊的進(jìn)程都將引起調(diào)用失敗。2)詳解進(jìn)程可調(diào)用同一模塊中的

49、其它進(jìn)程。如果使用其它模塊進(jìn)程的進(jìn)程句柄來調(diào)用該函數(shù)將引起可恢復(fù)錯誤。在同一事件中,對函數(shù)op_pro_invoke()的調(diào)用次數(shù)并沒有任何限制。換句話說,調(diào)用函數(shù)op_pro_invoke()所導(dǎo)致中斷的進(jìn)程,可接著利用該函數(shù)調(diào)用其他進(jìn)程。這種一連串的進(jìn)程調(diào)用稱為當(dāng)前調(diào)用棧,就像C語言中的函數(shù)調(diào)用棧一樣。仿真內(nèi)核限制進(jìn)程在當(dāng)前調(diào)用棧中調(diào)用其他進(jìn)程。當(dāng)進(jìn)行進(jìn)程調(diào)用時,調(diào)用進(jìn)程可建立一個內(nèi)存塊,供它和被調(diào)用進(jìn)程共享。由于該內(nèi)存可傳遞被調(diào)用進(jìn)程的輸入和輸出參數(shù),因而作為參數(shù)內(nèi)存。若調(diào)用進(jìn)程需要通過函數(shù)op_pro_argmem_access()來獲取內(nèi)存塊地址,則地址必須作為參數(shù)傳遞給op_pro

50、_invoke();若無此需要,則應(yīng)傳遞常量OPC_NIL。此外,該核心函數(shù)的安全級別為Forced serialization。3)目的多個進(jìn)程可共同處理單一隊列或處理器模塊上下文中發(fā)生的事件。通常對進(jìn)程進(jìn)行分層組織,父進(jìn)程根據(jù)不同事件的要求將事件處理任務(wù)交給合適的子進(jìn)程。另外一種進(jìn)程組織方式就是根據(jù)功能行來劃分任務(wù),如可根據(jù)進(jìn)程收到的中斷類型調(diào)用不同的子進(jìn)程。大多數(shù)組織化機制都有一個共通處,即都需要在模塊中臨時傳遞對子進(jìn)程或?qū)Φ冗M(jìn)程的執(zhí)行控制權(quán)。這就需要通過函數(shù)op_pro_invoke()來完成,并提供需執(zhí)行的進(jìn)程句柄。4)錯誤Program Abort:核心函數(shù)需要進(jìn)程上下文。Prog

51、ram Abort: 分段錯誤(由畸形進(jìn)程句柄導(dǎo)致)。Recoverable Error:進(jìn)程句柄無效。Recoverable Error:進(jìn)程句柄指向被銷毀進(jìn)程。Recoverable Error:進(jìn)程句柄指向遠(yuǎn)程進(jìn)程。Recoverable Error:進(jìn)程句柄指向活動進(jìn)程。5)相關(guān)函數(shù)采用op_pro_argmem_access()獲取調(diào)用參數(shù)內(nèi)存的訪問權(quán)。采用op_pro_parent()獲取父進(jìn)程的進(jìn)程句柄。采用op_pro_create()創(chuàng)建新的進(jìn)程并獲取其句柄。5. op_pro_argmem_access ()此函數(shù)的作用是獲取進(jìn)程調(diào)用所傳遞的參數(shù)內(nèi)存的地址。1)返回值Var

52、type*調(diào)用進(jìn)程提供的用戶自定義內(nèi)存塊的地址。若仿真內(nèi)核直接調(diào)用進(jìn)程或調(diào)用進(jìn)程不愿傳遞任何參數(shù)內(nèi)存,則返回符號常量OPC_NIL。2)詳解參數(shù)內(nèi)存是一個用戶自定義的內(nèi)存塊,其地址由進(jìn)程調(diào)用其他進(jìn)程時傳遞。內(nèi)存的格式和內(nèi)容都是用戶自定義的,只有其地址由仿真內(nèi)核管理。仿真內(nèi)核保證只有通過函數(shù)傳遞的內(nèi)存地址阻塞時,才能被調(diào)用進(jìn)程訪問,并將控制權(quán)返回給調(diào)用進(jìn)程。地于直接由仿真內(nèi)核調(diào)用的進(jìn)程,該核心函數(shù)將返回一個空地址OPC_NIL。直接由內(nèi)核調(diào)用的進(jìn)程和通過函數(shù)op_pro_invoke()調(diào)用的進(jìn)程應(yīng)在使用該指針訪問參數(shù)值之前檢查返回的地址是否為OPC_NIL,否則將發(fā)生分段錯誤。調(diào)用函數(shù)op_p

53、ro_invoke()可使用參數(shù)內(nèi)存機制,這時被調(diào)用進(jìn)程并不需要接收傳入的值或向調(diào)用進(jìn)程返回任何數(shù)據(jù)。在這種情況下,通常在需要參數(shù)內(nèi)存的情況下,調(diào)用函數(shù)op_pro_invoke()應(yīng)傳遞符號常量OPC_NIL。此外,該核心函數(shù)的安全級別為Forced serialization。3)目的該核心函數(shù)提供了一種在調(diào)用進(jìn)程和被調(diào)用進(jìn)程間共享內(nèi)存的機制。內(nèi)存可在調(diào)用前建立,以包含輸入?yún)?shù)值。被調(diào)用進(jìn)程可以檢查檢查該參數(shù)值,并利用它來處理事件。同樣被調(diào)用進(jìn)程可修改內(nèi)存,以向調(diào)用進(jìn)程返回輸出參數(shù),而調(diào)用進(jìn)程可在函數(shù)op_pro_invoke()返回之后檢查內(nèi)存的內(nèi)容。該核心函數(shù)提供了一種在調(diào)用進(jìn)程和被調(diào)

54、用進(jìn)程間共享內(nèi)存的機制。內(nèi)存可在調(diào)用前建立,以包含輸入?yún)?shù)值。被調(diào)用進(jìn)程可以檢查該參數(shù)值,并利用它。4)錯誤Program Abort:核心函數(shù)需要進(jìn)程上下文。5)相關(guān)函數(shù)采用op_pro_invoke()調(diào)用進(jìn)程模型。采用op_pro_modmem_access()與同一模塊中的其他進(jìn)程共享信息。采用op_pro_parmem_access()與進(jìn)程及其父進(jìn)程共享信息。2.4 事件函數(shù)集op_ev_cancel(evhandle)函數(shù)的作用是撤銷預(yù)設(shè)的事件,其參數(shù)說明如表2-10所示。表2-10 op_ev_cancel()函數(shù)的參數(shù)說明參 數(shù)類 型描 述evhandleEvhandle被取

55、消事件的事件句柄。事件句柄可以通過本函數(shù)集中的op_ev_seek_time()、op_ev_next()、op_intrpt_schedule_self()等函數(shù)獲取1)返回值Compcode表示操作是否成功的完成代碼,包括符號常量OPC_COMPCODE_SUCCESS和OPC_COMPCODE_FAILURE。2)詳解取消事件就是將其從仿真事件列表中移除,并阻止其向目的模塊發(fā)送。該函數(shù)只能用于取消未決的事件,取消已經(jīng)發(fā)送或正在執(zhí)行的事件將導(dǎo)致錯誤發(fā)生。因為仿真內(nèi)核將事件信息緩存到了相應(yīng)的事件句柄中,這樣無需查找就可很快對事件進(jìn)行定位,所以利用該函數(shù)取消事件時不必考慮效率問題。在事件發(fā)送之前使用該函數(shù)將其取消將比事件發(fā)送到目的地后再將其取消更加高效。此外,該核心函數(shù)的安全級別為Forced serialization。3)目的該核心函數(shù)提供了一種撤銷無用事件的機制。該函數(shù)常用于取消op_intrpt_schedule_self()函數(shù)預(yù)設(shè)的超時中斷事件。如果在超時前收到ack包或有其他中斷發(fā)生,則該函數(shù)將取消超時事件,并重置定時器。4)錯誤Program Abort: 分段錯誤(由畸形進(jìn)程句柄導(dǎo)致)。Recoverable Error:事件句柄指向無效或當(dāng)前還未預(yù)設(shè)的事件。Recoverable Error:無法取消當(dāng)前事件。Re

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論