• LWIP UDP 协议分析


    一、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  *.*
  • 相关阅读:
    Too many fields describes: 101 解决方法
    [Salesforce] 时区 问题
    [Salesforce] related list remove edit link
    apex获取页面中的url中的参数
    定义常量 map
    FIELD_CUSTOM_VALIDATION_EXCEPTION
    Salesforce message 里 放 link
    WinForm上显示gif动画[转]
    C/C++ Handle data types[转]
    Temporary Post Used For Theme Detection (b4e6dd688472447db6af8590aee16d59 3bfe001a32de4114a6b44005b770f6d7)
  • 原文地址:https://www.cnblogs.com/glguan/p/2133455.html
Copyright © 2020-2023  润新知