关闭

opnet packet field的设置

647人阅读 评论(7) 收藏 举报
分类:

在Opnet中field有三种类型:standard field、info field和structure field.他们的 含义我就不多说了,主要说一说这 几种域怎样使用(以nfd为例)。

可能有人马上就说了:用op_pk_nfd_set()来设置域,用op_pk_nfd_get()来读取。

对!是这样。

可是别忘了:op_pk_nfd_set()是有三个的!

什么?只有一个?那你需要继续往下看了,不然会死得很惨。

 

/************************************************************************/

/* 最重要的:不要把这几个函数用乱了,要不然编译时系统不会提示出错       */

/* 但运行的时候就会出现莫名其妙的问题了!                              */

/* 有可能问题会出现在很远的地方,很难找。                               */

/************************************************************************/

先说standard吧

op_pk_nfd_set(pkptr, fd_name, value)

pkptr是指向packet的指针,fd_name是域的名字,value是域的值.

例:op_pk_nfd_set(pkptr,"field_one", 12345);

接下来是info field

op_pk_nfd_set(pkptr, fd_name)

pkptr是指向packet的指针,fd_name是域的名字

例:op_pk_nfd_set(pkptr,"info_pkt");

最后说说最容易出错的structurefield,很多人在这里会出错。

op_pk_nfd_set(pkptr, fd_name, value,copy_proc, dealloc_proc, alloc_size)

看名字就够长吧?

pkptr是指向packet的指针,fd_name是域的名字,

value可不是field的值了,他是指向该field类型的指针,

copy_proc是一个函数,用来为field类型的数据申请内存并将值拷贝进去,

dealloc_proc也是一个函数,用来释放field类型的数据占用的内存,

alloc_size就是该类型所占存储空间的大小了。

例:

fd_ptr = (field_type *) op_prg_mem_alloc(sizeof (field_type));

fd_ptr->int_value = 54321;

op_pk_nfd_set (pkptr,"field_name", fd_ptr, op_prg_mem_copy_create, op_prg_m

em_free, sizeof (field_type));

又是好长的一句呀!什么?还有比它长三倍的呢?

对了,我好像也写过那么长的。那就说它比较长吧,这家大家满足了吧。

下面解释一下.

首先申请内存,用fd_ptr来保存内存的首地址。

然后,给结构中的元素赋值。

最后将结构加到packet里面。

在调用op_pk_nfd_set之后,你申请的内存就被链到packet上了,将来destroy这个包的时候opnet会把它释放掉的。所以不 要再试图对fd_ptr的内容进行操作了。

op_prg_mem_copy_create是opnet提供的函数,将来复制packet时opnet会调用它来完成这个field内存的申请和值的复制。

op_prg_mem_free也是opnet提供的函数,将来destroy这个包的时候就靠它来destroy这个field了。

 

什么?上面说的都是opnet的help里的?

那我只好出绝招了!

为什么opnet一定要提供copy_proc, dealloc_proc和alloc_size呢?

有的时候structure里面含有指针类型的元素。

而这个指针指向的内容也是你想要随着packet一起被传输、复制和摧毁的。

这时候opnet提供的op_prg_mem_copy_create和op_prg_mem_free就不好用了。

你必须自己些两个函数来完成这些功能。

例:

域的定义

typedef struct field_type

{

       char*   pch;

       int     length;

}field_type;

自己写的两个函数:

field_type*my_prg_mem_copy_create(field_type* field, size_t size)

{

       field_type* temp;

       temp = (field_type *) op_prg_mem_alloc(size);

       op_prg_mem_copy(field, temp, size);

       temp->pch = (char *) op_prg_mem_alloc(temp->length);

       op_prg_mem_copy(field->pch, temp->pch, temp->length);

       return(temp);

}

void my_prg_mem_free(field_type* field)

{

       op_prg_mem_free(field->pch);

       op_prg_mem_free(field);

}

op_pk_nfd_set的用法:

fd_ptr = (field_type *) op_prg_mem_alloc(sizeof (field_type));

fd_ptr->pch = "hello! world.";

fd_ptr->length = 14;

op_pk_nfd_set (pkptr,"field_name", fd_ptr, my_prg_mem_copy_create, my_prg_m

em_free, sizeof (field_type));

原文地址:

http://bbs.njupt.edu.cn/cgi-bin/bbsanc?path=/groups/science.faq/Optical_Comm/D90027EFE/M.1091460333.A

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2241次
    • 积分:38
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:4篇
    • 译文:0篇
    • 评论:7条
    文章分类
    文章存档
    最新评论