op_pk_nfd_set()

op_pk_nfd_set()

转载:

在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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值