本文共 2616 字,大约阅读时间需要 8 分钟。
转载:
在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_typemy_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