simple_udp_register中回掉函数解析

simple-udp.c中的simple_udp_register()函数的解析,重点为回掉函数,结合broadcast-udp.c这个例子对其进行分析。

broadcast-udp.c是基于simple-udp的一个广播数据报的例子。

int simple_udp_register(structsimple_udp_connection *c,

uint16_t local_port,

uip_ipaddr_t *remote_addr,

uint16_t remote_port,

simple_udp_callback receive_callback)

该函数的声明在simple-udp.h头文件进行声明,注册一个UDP连接

receive_callback 一个指针,指向一个函数,该函数在接收到数据包时将被调用

返回值:0,无法分配UDP连接;1,连接成功分配

该函数注册一个UDP连接,同时附加一个回调函数给它。该毁掉函数在有数据包到来时将被调用。本地UDP端口可以设置为0来表示一个临时的UDP端口应当被分配。远程IP地址可以为空,表示来自任何IP地址的数据包应当被接受。

同时,在该头文件中,也声明了simple_udp_callback回掉函数,需要注意的是,这里只是声明,真正的实现是在调用方broadcast-udp.c这个例子程序中。

回调函数:typedef void (*simple_udp_callback)(struct simple_udp_connection *c,

constuip_ipaddr_t *source_addr,

uint16_tsource_port,

constuip_ipaddr_t *dest_addr,

uint16_tdest_port,

constuint8_t *data, uint16_t datalen);

声明一个回调函数指针,并将其转换成simple_udp_callback类型。(声明在simple-udp.h中)

但该回调函数的实现是在例子程序broadcast-udp.c中通过名为recerver的函数实现的。

这是回调函数的典型应用实例。

simple_udp_register函数中对回掉函数进行了赋值,通过下面这行代码:

c->receive_callback = receive_callback

这句话看起来像是赋值,其实receive_callback都是指针,这样,两个指针是指向了同一个内存空间,即回调函数,在本例中,也就是broadcast-udp.c中的receiver函数,这样对c->receive_callback的操作就等同于receiver的操作,这样就明白了receiver其实是通过c->receive_callback进行赋值的(这种用法在contiki中很常见),赋值过程发生在simple-udp.c的进程处理函数中,如下:

if(c->receive_callback != NULL) {

PROCESS_CONTEXT_BEGIN(c->client_process);

c->receive_callback(c,

&(UIP_IP_BUF->srcipaddr),

UIP_HTONS(UIP_IP_BUF->srcport),

&(UIP_IP_BUF->destipaddr),

UIP_HTONS(UIP_IP_BUF->destport),

databuffer,uip_datalen());

PROCESS_CONTEXT_END();

其中,

#define UIP_IP_BUF   ((struct uip_udpip_hdr*)&uip_buf[UIP_LLH_LEN])

而,

/* The UDP and IP headers. */

struct uip_udpip_hdr {

#if UIP_CONF_IPV6

/* IPv6 header. */

uint8_t vtc,

tcf;

uint16_t flow;

uint8_t len[2];

uint8_t proto, ttl;

uip_ip6addr_t srcipaddr, destipaddr;

#else /* UIP_CONF_IPV6 */

/* IP header. */

uint8_t vhl,

tos,

len[2],

ipid[2],

ipoffset[2],

ttl,

proto;

uint16_t ipchksum;

uip_ipaddr_t srcipaddr, destipaddr;

#endif /* UIP_CONF_IPV6 */

/* UDP header. */

uint16_t srcport,

destport;

uint16_t udplen;

uint16_t udpchksum;

};

这样就明白&(UIP_IP_BUF->srcipaddr)的含义就是指向源地址;UIP_IP_BUF->srcport指向端口号。

时间: 2024-08-29 02:48:16

simple_udp_register中回掉函数解析的相关文章

JS-特效 ~ 05. 缓动框架兼容封装/回掉函数/兼容透明度/层级、旋转轮播图、正则表达式、验证表单注册账号、

缓动函数中opcity  写百分值的值 JS一般不用小数运算,会照成精度丢失 元素的默*认透明度是 层级一次性赋值,不缓动 利用for-in为同一个父元素的子元素绑定属性 缓动框架兼容封装/回掉函数/兼容透明度/层级 function animate(ele,json,fn){ //先清定时器 clearInterval(ele.timer); ele.timer = setInterval(function () { //开闭原则 var bool = true; //遍历属性和值,分别单独处

thread.join函数,java多线程中的join函数解析

join函数的作用,是让当前线程等待,直到调用join()的 线程结束或者等到一段时间,我们来看以下代码 1 package mian; 2 3 4 public class simpleplela { 5 static void threadMessage(String message) { 6 String threadName = 7 Thread.currentThread().getName(); 8 9 System.out.println(threadName+" "+m

C++中的虚函数解析[The explanation for virtual function of CPlusPlus]

1.什么是虚函数?                                                                                                                                               答:在C++的类中,使用virtual修饰的函数. 例如: virtual void speak() const { std::cout << "Mammal speak!\n&quo

Callback函数详解(我感觉,回掉函数的本质是函数指针,在业务做循环处理的时候,调用一下通知外部)

2010年的最后一天了,转载一篇自己认为还不错的文章与大家分享.希望对大家有所帮助. 一,回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子函数)有何不同呢? 使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数. 而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利

android 回掉函数一:基本概念

1.概念 客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数. 一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供. 由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数. 2.举个栗子 某天,我打电话向你请教问题,当然是个难题,^_^,你一时想不出解决方法,我又不能拿着电话在那里傻等

TP3.2框架中的字母函数解析

C的使用方法以及注意事项 使用方法: 1.读取配置 C('参数名称')  配置参数不区分大小写,存在则设置,否则返回NULL; 因为配置参数是全局有效的,因此C方法可以在任何地方读取任何配置,即使某个参数设置已经过期了 2.动态配置 C('参数名称',参数的值)  动态配置赋值仅对当前请求有效,不会对以后的请求造成影响. 注意事项: TP的调试模式其实就是控制了TP的配置信息以及函数的缓存功能.如果开启了调试模式,每次访问项目,TP都会去加载最新的配置以及函数信息:如果关闭了调试模式,当TP第一

缓动动画(加回掉函数)

function animate(obj, json,fn){ clearInterval(obj.timer); obj.timer=setInterval(function(){ var flag = true; for(var k in json){ var target = json[k]; // leader = 当前元素的属性值 var leader =parseInt(getStyle(obj,k)); // 缓动公式step =(target - leader)/10 leade

自定义带进度条的WebView , 增加获取web标题和url 回掉

1.自定义ProgressWebView package com.app.android05; import android.content.Context; import android.graphics.Bitmap; import android.util.AttributeSet; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ProgressBar; /

AngularJS指令中的compile与link函数解析

AngularJS指令中的compile与link函数解析 通常大家在使用ng中的指令的时候,用的链接函数最多的是link属性,下面这篇文章将告诉大家complie,pre-link,post-link的用法与区别. 原文地址 angularjs里的指令非常神奇,允许你创建非常语义化以及高度重用的组件,可以理解为web components的先驱者. 网上已经有很多介绍怎么使用指令的文章以及相关书籍,相互比较的话,很少有介绍compile与link的区别,更别说pre-link与post-lin