lwip udp 发送_lwip udp发送

lwip udp 发送_lwip udp发送一、udp.c实现的函数1、void udp_input(structpbuf*p,structnetif*inp)说明:处理接收到的udp数据包。参数:p数据包缓存区;inp网络接口。   2、err_t udp_send(structudp_pc…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、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()的处理流程图

lwip udp 发送_lwip udp发送

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处理流程图:

lwip udp 发送_lwip udp发送

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

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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • protege5.5_ProE4.0

    protege5.5_ProE4.0OWL本体的重要组成部分Individuals:个体,代表一个领域里面的对象。可以理解成一个类的实例(instancesofclasses)。Properties:属性,是两个个体之间的双重联

    2022年8月4日
    7
  • scp命令传文件

    scp命令传文件SCP进行文件传输1、基本语法:2、具体用法1、从本地将文件传输到服务器2、从本地将文件夹传输到服务器3、将服务器上的文件传输到本地4、将服务器上的文件夹传输到本地1、基本语法:Linuxscp命令用于Linux之间复制文件和目录。scp是securecopy的缩写,scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。scp是加密的,rcp是不加密的,scp是rcp的加强版。scp【本地或远程文件的路径】【服务器用户名】@【服务器地址】:【远程或

    2022年7月27日
    2
  • stata 导出 相关系数表_STATA数据处理技巧与计量分析二|基本语句介绍

    stata 导出 相关系数表_STATA数据处理技巧与计量分析二|基本语句介绍更多精彩内容请关注211统计课堂上期小统和大家一起了解了STATA数据处理技巧与计量分析的背景介绍,这期小统和大家一起学习一下基本语句介绍。Stata操作界面核心功能(dofile)Stata中的命令集合文件,在编程语言中成为脚本(scripts),是指为达到某一分析目的进行的数据读取、数据处理、分析等的命令集合。Stata的基础语法基本语法结构:funNamevariable/(v…

    2022年6月16日
    133
  • Mysql命令行修改字段类型

    Mysql命令行修改字段类型在做微信公众平台知识百科(账号:zhishiwiki)时,因为字段先前设计的不合理,导致内容装不下,因此需要修改其字段类型为text这里使用到了alter命令altertable表名称modify字段名称字段类型[是否允许非空];作者说:只有用到了,才能学

    2022年5月20日
    34
  • STM32F103学习笔记三 串口通信

    STM32F103学习笔记三 串口通信本文参照正点原子STM32F1xx官方资料:《STM32中文参考手册V10》-第25章通用同步异步收发器(USART)及【STM32】串口通信基本原理(超基础、详细版)单片机入门学习十STM32单片机学习七串口通讯-风水月的专栏](https://blog.csdn.net/fengshuiyue/article/details/79095389)1、串口通信背景知识1.1、…

    2022年10月9日
    0
  • Snort安装_snorer

    Snort安装_snorer1、下载源文件wgethttps://www.snort.org/downloads/snort/daq-2.0.6.tar.gzwgethttps://www.snort.org/downloads/snort/snort-2.9.8.0.tar.gz2、解压安装tarxvfzdaq-2.0.6.tar.gzcddaq-2.0.6./configure;mak

    2022年10月24日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号