博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
op_pk_nfd_set()
阅读量:3917 次
发布时间:2019-05-23

本文共 2616 字,大约阅读时间需要 8 分钟。

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

你可能感兴趣的文章
说说 RabbiMQ 的应答模式
查看>>
OpenTelemetry - 云原生下可观测性的新标准
查看>>
使用 ML.NET 实现峰值检测来排查异常
查看>>
dnSpy反编译、部署调试神器
查看>>
使用 Avalonia 开发 UOS 原生应用
查看>>
开放封闭在.NET中
查看>>
【One by One系列】IdentityServer4(二)使用Client Credentials保护API资源
查看>>
【One by One系列】IdentityServer4(三)使用用户名和密码
查看>>
RabbitMQ 入门:2. Exchange 和 Queue
查看>>
使用 Tye 辅助开发 k8s 应用竟如此简单(一)
查看>>
Code Runner for VS Code 突破 2000 万下载量!支持超过 50 种语言
查看>>
后宫佳丽三千,假如古代皇帝也懂负载均衡算法...
查看>>
如何在 C# 8 中使用 Channels
查看>>
巧用Dictionary实现日志数据批量插入
查看>>
asp.net core安全事项(下)
查看>>
Asp.Net Core之Identity应用(下篇)
查看>>
Docker查看应用的实际内存
查看>>
面向业务的微服务消息总线
查看>>
国产CPU群雄逐鹿谁主沉浮
查看>>
专业的软件安装包可以这样做!
查看>>