免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2489 | 回复: 3
打印 上一主题 下一主题

udp_rcv函数中的一个疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-14 11:50 |只看该作者 |倒序浏览
子函数udp_queue_rcv_skb中
  1. if (!sock_owned_by_user(sk))
  2.                 rc = __udp_queue_rcv_skb(sk, skb);
  3.         else
  4.                 sk_add_backlog(sk, skb);
复制代码
看字面意思,如果用户空间没有持有锁,就将skb加入到收包队列中去,等待用户空间进行recvfrom

否则调用sk_add_backlog,不知道这个流程什么意思?这时候内核收到的skb难道用户空间获取不到了?

论坛徽章:
0
2 [报告]
发表于 2011-06-14 13:22 |只看该作者
是的。
包被加入到 sk->sk_backlog中后,直到某个事件(sock被释放,被解锁),队列中数据
会被转移到  sk_receive_queue队列中。

用户层只能直接从 sk_receive_queue中获取数据包。

回复 1# phoxia

论坛徽章:
0
3 [报告]
发表于 2011-06-14 14:13 |只看该作者
回复 2# asweisun_shan


    哪个函数会将back队列中的数据移到sk_receive_queue队列中去?谢谢!

论坛徽章:
0
4 [报告]
发表于 2011-06-14 14:23 |只看该作者
回复 2# asweisun_shan

找到了
release_sock会调用回掉函数sk_backlog_rcv将back队列中的数据移到receive队列中去,对于udp协议就是调用sock_queue_rcv_skb

谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP