首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >lwip udp 发送_lwip udp发送

lwip udp 发送_lwip udp发送

作者头像
全栈程序员站长
发布于 2022-10-04 13:24:20
发布于 2022-10-04 13:24:20
4.1K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

一、udp.c实现的函数

1、void udp_input(struct pbuf *p, struct netif *inp)

说明:处理接收到的udp数据包。

参数:p数据包缓存区;inp网络接口。

2、err_t udp_send(struct udp_pcb *pcb, struct pbuf *p)

说明:发送udp包。这个函数直接调用udp_sendto()函数。

参数:pcb协议控制块;p数据包发送缓存区。

返回:ERR_OK发送成功;ERR_MEM发送溢出;ERR_RTE不能发送到指定ip;其它表示发送失败。

3、err_t udp_sendto(struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *dst_ip, u16_t dst_port)

说明:发送udp包到指定ip地址。

参数:pcb协议控制块;p数据包发送缓存区;dst_ip目的ip地址;dst_port目的端口号。

4、err_t udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *dst_ip, u16_t dst_port, struct netif *netif)

说明:按照指定的网络接口和ip地址发送udp包。

参数:pcb协议控制块;p数据包发送缓存区;dest_ip目的ip地址;dst_port目的端口号,netif网络接口。

5、err_t udp_bind(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)

说明:在协议控制块中绑定本地ip地址和本地端口号

参数:pcb协议控制块;ipaddr本地ip地址;port本地端口号。

返回:ERR_OK成功;ERR_USE已经被占用。

6、err_t udp_connect(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)

说明:与远端udp主机建立连接。

参数:pcb所需连接的协议控制块;ipaddr远端ip地址;port远端端口号。

7、void udp_disconnect(struct udp_pcb *pcb)

说明:断开指定连接。

参数:pcb所需断开连接的协议控制块。

8、void udp_recv(struct udp_pcb *pcb, void (* recv)(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port), void *rev_arg)

说明:设置接收到数据包时调用的回调函数及其参数。

参数:pcb协议控制块;recv回调函数名(地址);rev_arg回调函数参数。

这个函数直接修改pcb->recv和pcb->recv_arg的值。

9、void udp_remove(struct udp_pcb *pcb)

说明:删除指定udp协议控制块,从协议控制链表中删除并释放内存资源。

参数:pcb所要删除的协议控制块。

10、struct udp_pcb * udp_new(void)

说明:创建udp协议控制块,并不分配资源。

返回:协议控制块指针,指向NULL。

– UDP functions

err_t udp_bind(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port) 函数遍历整个UDP PCB链表,以排除在没有设置REUSE_ADDR或者REUSE_PORT标志的情况下绑定到一个以相同port绑定的pcb或者以相同port及ip绑定的pcb。如果需要绑定的port无效,则分配最小可用port。如果该pcb未在原来PCB链表中,则加入链表。具体流程参看流程图。 err_t udp_connect(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port) 连接到远程端口。如果还未分配本地port,则分配一个空闲port。然后将一下两种地址绑定类型进行转换: a. *.local_port foreign_ip.foreign_port: 调用ip_router确定本地ip。 b. *.* *.foreign_port: 转换为 *.local_port *.foreign_port

err_t udp_sendto(struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *dst_ip, u16_t dst_port) 该函数借用当前的pcb调用udp_send发送UDP包,完成后,回复原来pcb内容。

err_t udp_send(struct udp_pcb *pcb, struct pbuf *p) 如果pcb未绑定,则调用udp_bind获取一个可用的port绑定之。然后构造UDP包,查找能够到达remote_ip的router接口,如果有必要,将该接口的本地ip作为UDP的src ip。如果UDP需要校验和,则调用inet_chksum_pseudo函数,计算校验和。最后调用ip_output_if将UDP包传送到下层IP层发送。

void udp_input(struct pbuf *p, struct netif *inp) 该函数接受来自ip层的UDP包。将所有PCB都遍历,如果有多个绑定,则给每一个进程复制一份数据报,实际调用pcb->recv()。 其中的数据报的地址绑定匹配优先级和协议上的略有区别: Local Foreign local_ip(*).local_port foreign_ip(*).foreign_port

local_ip(*).local_port *.*

UDP发送过程:

1.应用层:绑定UDP套接字 我们必须先创建一个UDP套接字,通过调用udp_new()进行申请

然后调用udp_bind()绑定在UDP端口上。在这个调用过程中,我们必须编写一个用于处理这个UDP套接字接收到的数据报文的函数,并把这个函数作为udp_bind()的参数,以后当套接字接收到数据报文时会自动调用这个函数,我们将在后面介绍这个函数怎么调用的。

绑定结束之后,必须调用udp_connect()将数据报文的目的地址绑定在UDP的数据结构中,最后就是调用udp_send()把数据报文发送出去。

udp_bind()的处理流程图

2.传输层的处理 做好应用层的处理之后,数据报文被提交到UDP层,udp_send()函数中首先给数据报文加入UDP头部,然后调用ip_route()选择一个合适的网络接口进行发送,最后调用ip_output()把数据报文传入IP层。

3.IP层的处理 ip_route()函数比较各个网络接口的IP地址是否与目的IP地址在同一子网中,如果有,就把它当成发送的网络接口返回,如果没有就返回一个默认的网络接口。 在ip_output()函数中,先给数据报文加上IP头部,然后比较目的IP地址与网络接口的IP地址是否在同一网段,如果不是,就必须先把数据报文发送到网关,于是使用网关的IP地址作为目的主机,如果目的IP地址与网络接口的IP地址在同一网段,则把目的IP地址作为目的主机。接着调用arp_lookup()在ARP缓存中查找目的主机的MAC地址,找到了调用ethernet_output()把数据报文传入到数据链路层发送,如果找不到,就调用arp_query()发送ARP请求解析目的主机的MAC地址。

4.ARP协议的处理 arp_lookup()实现在本地ARP缓存中查找目的主机的MAC地址,找到了返回该MAC地址,找不到返回NULL。 arp_query()函数中构造一个ARP请求报文,然后调用ethernet_output()把该报文送到数据链路层发送。

5. 数据链路层的处理 数据链路层的处理就是给数据报文添上相对的以太网头部,然后调用lowlever_output()直接把报文传送出去。

UDP接收过程:

接收过程与发送过程刚好相反:

数据报文首先调用ethernet_input()函数到达数据链路层,去掉以太网头部之后如果是ARP报文传给调用arp_input()交给ARP协议处理,如果是IP报文就调用ip_input()进入IP层处理。

ip_input()函数中比较数据报文的目的IP地址,如果与某个网络接口的IP地址相同,则接收这个报文,依照IP头部的协议字段,调用各自协议的输入处理函数,本例中将调用udp_input()。

在udp_input()中提取数据报文的端口号,然后在已登记的套接字中查找与该端口号符合的UDP接收函数,如果没有找到相应的套接字,调用icmp_output()发送一个ICMP不可达报文,如果找到了,就调用该函数(这个函数就是我们在udp_bind()时传入的其中一个参数)。

udp_input处理流程图:

http://blog.chinaunix.net/uid-26611973-id-3181142.html

http://blog.csdn.net/zyboy2000/article/details/4297638

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                </div>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/195981.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月8日 上,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一文读懂支持向量机SVM(附实现代码、公式)
支持向量机(SVM),一个神秘而众知的名字,在其出来就受到了莫大的追捧,号称最优秀的分类算法之一,以其简单的理论构造了复杂的算法,又以其简单的用法实现了复杂的问题,不得不说确实完美。
数据派THU
2018/07/30
6.6K1
一文读懂支持向量机SVM(附实现代码、公式)
【机器学习与实现】支持向量机SVM
图中深蓝色线便是决策边界,也称分离超平面;两条虚线之间宽度叫做间隔 (margin)。支持向量机的优化目标为——间隔最大化。
Francek Chen
2025/01/23
2740
【机器学习与实现】支持向量机SVM
机器学习十大经典算法之支持向量机
在分类问题中,除了线性的逻辑回归模型和非线性的深度神经网络外,我们还可以应用一种被广泛应用于工业界和学术界的模型——支持向量机(SVM),与逻辑回归和神经网络相比,支持向量机在学习复杂的非线性方程时提供了一种更为清晰,更加强大的方式。支持向量机相对于神经网络和逻辑回归,特别擅长于特征维数多于样本数的情况,而小样本学习至今仍是深度学习的一大难题。
墨明棋妙27
2022/09/23
6950
Andrew Ng机器学习课程笔记--week7(SVM)
本周主要学习SVM 一、 内容概要 Large Margin Classification Optimization Objective(优化Objective(损失函数)) Large Margin Intuition(大边距的直观理解) Mathematics Behind Large Magin Classification(最大间距分类器背后的数学推导) Kernels Kernels 1 Kernels 2 SVMs in Practice Using An SVM 二、重点&难点 1. L
marsggbo
2018/01/23
6400
Andrew Ng机器学习课程笔记--week7(SVM)
机器学习:支持向量机SVM
,代价图像如上图左所示,我们的优化目标是使得代价函数尽量的小,在图中可以看出,当
Here_SDUT
2022/09/19
7340
机器学习:支持向量机SVM
第十三章 支持向量机
到目前为止,你已经见过一系列不同的学习算法。在监督学习中,许多学习算法的性能都非常类似,因此,重要的不是你该选择使用学习算法A还是学习算法B,而更重要的是,应用这些算法时,所使用的数据量。这就体现你使用这些算法时的技巧了,比如:你为学习算法所设计的特征量的选择,以及如何选择正则化参数,诸如此类的事。
tomas家的小拨浪鼓
2019/03/15
6470
第十三章 支持向量机
图解机器学习 | 支持向量机模型详解
教程地址:http://www.showmeai.tech/tutorials/34
ShowMeAI
2022/03/10
1.1K0
图解机器学习 | 支持向量机模型详解
Python机器学习的练习六:支持向量机
在这个练习中,我们将使用支持向量机(SVMs)创建一个垃圾邮件分类器。在一些简单的2D数据集上使用SVMs去观察他们如何工作,接下来我们查看一组邮件数据集,并且在处理过的邮件上使用SVMs创建一个分类器,用于判断他们是否是垃圾邮件。 尽管在多类场景中有使用SVMs的方法,但它是一种默认的二进制分类工具。SVMs还可以使用 kernel trick 来处理非线性分类,在尝试找到超平面之前,将数据投射到高维空间中。SVMs是一种强大的算法类,经常用于实际的机器学习应用程序。 首先要做的就是研究简单的二维数据集,
AiTechYun
2018/03/02
1.3K0
Python机器学习的练习六:支持向量机
R语言与机器学习(分类算法)支持向量机
说到支持向量机,必须要提到july大神的《支持向量机通俗导论》,个人感觉再怎么写也不可能写得比他更好的了。这也正如青莲居士见到崔颢的黄鹤楼后也只能叹“此处有景道不得”。不过我还是打算写写SVM的基本想法与libSVM中R的接口。 一、SVM的想法 回到我们最开始讨论的KNN算法,它占用的内存十分的大,而且需要的运算量也非常大。那么我们有没有可能找到几个最有代表性的点(即保留较少的点)达到一个可比的效果呢? 要回答这个问题,我们首先必须思考如何确定点的代表性?我想
机器学习AI算法工程
2018/03/12
1.2K0
R语言与机器学习(分类算法)支持向量机
支持向量机核技巧:10个常用的核函数总结
支持向量机是一种监督学习技术,主要用于分类,也可用于回归。它的关键概念是算法搜索最佳的可用于基于标记数据(训练数据)对新数据点进行分类的超平面。
deephub
2023/02/01
1.9K0
详解机器学习中的梯度消失、爆炸原因及其解决方法
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25737169/article/details/78847691
DoubleV
2018/09/12
5.3K0
详解机器学习中的梯度消失、爆炸原因及其解决方法
机器学习系列:(九)从感知器到支持向量机
从感知器到支持向量机 上一章我们介绍了感知器。作为一种二元分类器,感知器不能有效的解决线性不可分问题。其实在第二章,线性回归里面已经遇到过类似的问题,当时需要解决一个解释变量与响应变量存在非线性关系的问题。为了提高模型的准确率,我们引入了一种特殊的多元线性回归模型,多项式回归。通过对特征进行合理的组合,我们建立了高维特征空间的解释变量与响应变量的线性关系模型。 随着特征空间的维度的不断增多,在用线性模型近似非线性函数时,上述方法似乎依然可行,但是有两个问题不可避免。首先是计算问题,计算映射的特征,操纵高维的
小莹莹
2018/04/23
1.3K0
机器学习系列:(九)从感知器到支持向量机
机器学习-支持向量机SVM算法
支持向量机(Support Vector Machine, SVM)对监督学习下二分类问题提供了一个绝妙的解决方案。通过对偶函数和核函数求解,将适用范围从二维线性推广到多维非线性模型,使用相关方法变形,也可用于多分类问题和回归问题。
唔仄lo咚锵
2023/05/23
5870
机器学习-支持向量机SVM算法
支持向量机(Support Vector Machines,SVM)
线性可分SVM学习方法,对线性不可分训练数据是不适用的,怎么将它扩展到线性不可分,需要修改硬间隔最大化,使其成为软间隔最大化。
Michael阿明
2020/07/13
2K1
支持向量机(Support Vector Machines,SVM)
机器学习中最流行的模型之一,用于分类的支持向量机的完整介绍
支持向量机(SVM)是一个非常强大而多变的机器学习模型,能够执行线性或非线性的分类,回归,甚至异常值检测。它是机器学习中最流行的模型之一,任何对机器学习感兴趣的人都应该学习和使用它。SVM特别适用于复
AiTechYun
2018/03/05
2.8K0
机器学习中最流行的模型之一,用于分类的支持向量机的完整介绍
机器学习算法|支持向量机(Support Vector Machine,SVM)
机器学习(MachineLearning),作为计算机科学的子领域,是人工智能领域的重要分支和实现方式。
阿巴阿巴-
2025/03/03
1.4K0
如何用Python实现支持向量机(SVM)
SVM支持向量机是建立于统计学习理论上的一种分类算法,适合与处理具备高维特征的数据集。 SVM算法的数学原理相对比较复杂,好在由于SVM算法的研究与应用如此火爆,CSDN博客里也有大量的好文章对此进行分析,下面给出几个本人认为讲解的相当不错的: 支持向量机通俗导论(理解SVM的3层境界):http://blog.csdn.net/v_july_v/article/details/7624837 JULY大牛讲的是如此详细,由浅入深层层推进,以至于关于SVM的原理,我一个字都不想写了。。强烈推荐。 还有一个
机器学习AI算法工程
2018/03/13
1.7K0
如何用Python实现支持向量机(SVM)
机器学习算法Python实现
目录 一、线性回归 1、代价函数 2、梯度下降算法 3、均值归一化 4、最终运行结果 5、使用scikit-learn库中的线性模型实现 二、逻辑回归 1、代价函数 2、梯度 3、正则化 4、S型函数(即) 5、映射为多项式 6、使用的优化方法 7、运行结果 8、使用scikit-learn库中的逻辑回归模型实现 逻辑回归_手写数字识别_OneVsAll 1、随机显示100个数字 2、OneVsAll 3、手写数字识别 4、预测 5、运行结果 6、使用scikit-learn库中的逻辑回归模型实现 三、BP
企鹅号小编
2018/01/09
2.3K0
机器学习算法Python实现
Python3《机器学习实战》学习笔记(九):支持向量机实战篇之再撕非线性SVM
版权声明:本文为博主原创文章,未经博主允许不得转载。个人网站:http://cuijiahua.com。 https://blog.csdn.net/c406495762/article/details/78158354
Jack_Cui
2019/05/25
8240
Python3《机器学习实战》学习笔记(九):支持向量机实战篇之再撕非线性SVM
机器学习18:支持向量机(SVM)模型
SVM的推导过程的基本是对线性可分的样本空间的推导,后面的核函数是对线性不可分样本空间的推广,而松弛变量的引进是为了解决噪声(Outliers,异常值)的问题。所以这片文章着重对线性可分情形进行公式推导,后面有空闲时间在对核函数和松弛变量部分进行公式推导的补充。
用户5473628
2019/08/08
5260
机器学习18:支持向量机(SVM)模型
推荐阅读
相关推荐
一文读懂支持向量机SVM(附实现代码、公式)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验