Socket 数据包的接收(1)(转)

Linux TCP/IP协议栈之Socket的实现分析(数据包的接收)

前面了解过sk有一个接收队列,用于存储接收到的skb,对于socket层面上来讲,数据接收,就是要把数据从这个队列中取出来,交给上层用户态。这里涉及到出队操作,但是,要了解如何出队,就得了解传输层协议如何入队。前面一直用tcp协议来分析,现在还没有把整个tcp栈分析出来,要再继续用tcp协议来分析,就有点问题了,所以,数据的接收和发送,都将以udp协议来分析。虽然它很简单,但同样也反应了socket层数据与接收的全部核心内容与思路。我以希望,下一步拿下tcp协议后,再把这部份的tcp实现补上来。

一、udp层的数据接收
udp层的数据接收,对于socket而言,就是接收队列的入队操作。在ip层中,如果是本地数据,则会交由ip_local_deliver_finish()函数处理,它会根据传输层协议的类型,交由相应的处理函数,对于udp协议而言,就是udp_rcv():

int udp_rcv(struct sk_buff *skb)
{
          struct sock *sk;
          struct udphdr *uh;
        unsigned short ulen;
        struct rtable *rt = (struct rtable*)skb->dst;
        u32 saddr = skb->nh.iph->saddr;
        u32 daddr = skb->nh.iph->daddr;
        int len = skb->len;

       
        if (!pskb_may_pull(skb, sizeof(struct udphdr)))
                goto no_header;
               
       
        uh = skb->h.uh;
       
       
        ulen = ntohs(uh->len);
       
       
        if (ulen > len || ulen < sizeof(*uh))
                goto short_packet;
               
       
        if (pskb_trim(skb, ulen))
                goto short_packet;
       
       
        if (udp_checksum_init(skb, uh, ulen, saddr, daddr) < 0)
                goto csum_error;
       
       
        if(rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST))
                return udp_v4_mcast_deliver(skb, uh, saddr, daddr);
       
       

转载于:https://www.cnblogs.com/jinrize/archive/2009/11/29/1612863.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值