zoukankan      html  css  js  c++  java
  • udp 的 listen

      有一个想法:由于 udp 是无连接的 包传输模式! 所以有时在局域网想使用udp,但是 udp 是无连接的, 如果使用UDP 做服务器, 其是无连接的,那怎样实现其tcp的四元组有链接呢??

    想了一下:udp 添加listen 字段就行!!

    --------------------
    sk = __udp4_lib_lookup_skb(skb, uh->source, uh->dest, udptable); if (sk) return udp_unicast_rcv_skb(sk, skb, uh); ------------- __UDP_INC_STATS(net, UDP_MIB_NOPORTS, proto == IPPROTO_UDPLITE); icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0); /* * Hmm. We got an UDP packet to a port to which we * don't wanna listen. Ignore it. */ kfree_skb(skb);

    可以看到 收到 udp 报文时首先在 udp_table 中udp4_lib_lookup_skb 查找对应的sk

    查找到后执行 udp_unicast_rcv_skb 处理其报文

    否者drop 报文并发送对应icmp 信息

    是否可以这样设计:  

    首先在udp_table 中查找 sk  如果查找到了并且 sk->sk_state != UDP_LISTEN   rcv_skb 逻辑

    如果查找到并且sk->sk_state == UDP_LISTEN   则 在 udp_table_listen 中进行检查 合格后 创建新的new_udp_sk;然后执行skb->sk=new_udp_sk 赋值,接着执行 rcv_skb 逻辑 处理数据;

    最后将new_udp_sk  insert 到 udp_table中

    
    
    sk = __udp4_lib_lookup_skb(skb, uh->source, uh->dest, udptable);
    if (sk != NULL) {
      
    // 这个UDP_LISTEN,通过setsockopt来设置
       if (sk->sk_state == UDP_LISTEN) {
        // 如果是UDP的listener,创建一个新的new_udp_sk
        struct sock *new_udp_sk = inet_v4_udp_clone(sk, skb, GFP_ATOMIC);
        // 将新的数据传输sk排入全局的UDP socket hash表
        new_udp_sk->sk_prot->get_port(new_udp_sk, new_udp_sk->inet_num)
        ret
    =udp_unicast_rcv_skb(new_udp_sk, skb, uh);
          // 唤醒I/O复用 ---->唤醒accept 获取新的connect udp-sk
           sk->sk_data_ready(sk, 0);
          sock_put(new_udp_sk);
       }
    else {

         //正常内核协议栈原始逻辑
       }
    }
    http代理服务器(3-4-7层代理)-网络事件库公共组件、内核kernel驱动 摄像头驱动 tcpip网络协议栈、netfilter、bridge 好像看过!!!! 但行好事 莫问前程 --身高体重180的胖子
  • 相关阅读:
    leetcode——91.解码方法
    leetcode——64.最小路径和
    Layui上传图片2.0版
    LINQ中判断日期时间段
    Http基础
    Js中数组,字符串的常用方法
    C#数组,ArrayList,List区别
    08-01 通过线性回归了解算法流程
    08-00 课程习得
    C-02 推荐系统
  • 原文地址:https://www.cnblogs.com/codestack/p/14821975.html
Copyright © 2011-2022 走看看