TCP/IP源码学习(43)——__skb_recv_datagram学习
原文地址:TCP/IP源码学习(43)——__skb_recv_datagram学习 作者:GFree_Wind
- struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags,
- int *peeked, int *err)
- {
- struct sk_buff *skb;
- long timeo;
- /*
- * Caller is allowed not to check sk->sk_err before skb_recv_datagram()
- */
- int error = sock_error(sk);
- if (error)
- goto no_packet;
- timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
- do {
- /* Again only user level code calls this function, so nothing
- * interrupt level will suddenly eat the receive_queue.
- *
- * Look at current nfs client by the way...
- * However, this function was corrent in any case. 8)
- */
- unsigned long cpu_flags;
- spin_lock_irqsave(&sk->sk_receive_queue.lock, cpu_flags);
- /* 查看在socket的buffer中是否有数据包 */
- skb = skb_peek(&sk->sk_receive_queue);
- if (skb) {
- *peeked = skb->peeked;
- if (flags & MSG_PEEK) {
- /*
- 设置MSG_PEEK,表示用户不是真的要读取数据,只是一个peek调用。
- 那么并不真正读取数据
- */
- skb->peeked = 1;
- atomic_inc(&skb->users);
- } else
- __skb_unlink(skb, &sk->sk_receive_queue); //从队列中取出数据,即可看作读出数据
- }
- spin_unlock_irqrestore(&sk->sk_receive_queue.lock, cpu_flags);
- if (skb)
- return skb;
- /* User doesn't want to wait */
- error = -EAGAIN;
- /*
- timeo为0,有2中情况:1种是socket为非阻塞的,第2种,即socket阻塞的时间已经超过了timeo的值,
- 那么就跳到no_packet处理
- */
- if (!timeo)
- goto no_packet;
- } while (!wait_for_packet(sk, err, &timeo)); //阻塞进程,等待数据包
- return NULL;
- no_packet:
- *err = error;
- return NULL;
- }
- static int wait_for_packet(struct sock *sk, int *err, long *timeo_p)
- {
- int error;
- DEFINE_WAIT_FUNC(wait, receiver_wake_function);
- prepare_to_wait_exclusive(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
- /* Socket errors? */
- error = sock_error(sk);
- if (error)
- goto out_err;
- if (!skb_queue_empty(&sk->sk_receive_queue))
- goto out;
- /* Socket shut down? */
- if (sk->sk_shutdown & RCV_SHUTDOWN)
- goto out_noerr;
- /* Sequenced packets can come disconnected.
- * If so we report the problem
- */
- error = -ENOTCONN;
- if (connection_based(sk) &&
- !(sk->sk_state == TCP_ESTABLISHED || sk->sk_state == TCP_LISTEN))
- goto out_err;
- /* handle signals */
- if (signal_pending(current))
- goto interrupted;
- error = 0;
- /* sleep本进程,直至满足唤醒条件或者被信号唤醒——因为前面设置了TASK_INTERRUPTIBLE*/
- *timeo_p = schedule_timeout(*timeo_p);
- out:
- finish_wait(sk_sleep(sk), &wait);
- return error;
- interrupted:
- error = sock_intr_errno(*timeo_p);
- out_err:
- *err = error;
- goto out;
- out_noerr:
- *err = 0;
- error = 1;
- goto out;
- }
TCP/IP源码学习(43)——__skb_recv_datagram学习相关推荐
- [附源码]计算机毕业设计JAVA学习资源共享与在线学习系统
[附源码]计算机毕业设计JAVA学习资源共享与在线学习系统 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe ...
- 嵌入式之uboot源码分析-启动第二阶段学习笔记(下篇)
接上部分---->嵌入式之uboot源码分析-启动第二阶段学习笔记(上篇) 注:如下内容来自朱老师物联网大讲堂uboot课件 3.2.14 CFG_NO_FLASH (1)虽然NandFlash ...
- 【Faster R-CNN论文精度系列】从Faster R-CNN源码中,我们“学习”到了什么?
[Faster R-CNN论文精度系列] (如下为建议阅读顺序) 1[Faster R-CNN论文精度系列]从Faster R-CNN源码中,我们"学习"到了什么? 2[Faste ...
- 【 数据集加载 DatasetDataLoader 模块实现与源码详解 深度学习 Pytorch笔记 B站刘二大人 (7/10)】
数据集加载 Dataset&DataLoader 模块实现与源码详解 深度学习 Pytorch笔记 B站刘二大人 (7/10) 模块介绍 在本节中没有关于数学原理的相关介绍,使用的数据集和类型 ...
- 【分类器 Softmax-Classifier softmax数学原理与源码详解 深度学习 Pytorch笔记 B站刘二大人(8/10)】
分类器 Softmax-Classifier softmax数学原理与源码详解 深度学习 Pytorch笔记 B站刘二大人 (8/10) 在进行本章的数学推导前,有必要先粗浅的介绍一下,笔者在广泛查找 ...
- 【 反向传播算法 Back-Propagation 数学推导以及源码详解 深度学习 Pytorch笔记 B站刘二大人(3/10)】
反向传播算法 Back-Propagation 数学推导以及源码详解 深度学习 Pytorch笔记 B站刘二大人(3/10) 数学推导 BP算法 BP神经网络可以说机器学习的最基础网络.对于普通的简单 ...
- 【 卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10)】
卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10) 本章主要进行卷积神经网络的相关数学原理和pytorch的对应模块进行推导分析 代码也是通过demo实 ...
- 【 梯度下降算法 Gradient-Descend 数学推导与源码详解 深度学习 Pytorch笔记 B站刘二大人(2/10)】
梯度下降算法 Gradient-Descend 数学推导与源码详解 深度学习 Pytorch笔记 B站刘二大人(2/10) 数学原理分析 在第一节中我们定义并构建了线性模型,即最简单的深度学习模型,但 ...
- 【多输入模型 Multiple-Dimension 数学原理分析以及源码详解 深度学习 Pytorch笔记 B站刘二大人 (6/10)】
多输入模型 Multiple-Dimension 数学原理分析以及源码源码详解 深度学习 Pytorch笔记 B站刘二大人(6/10) 数学推导 在之前实现的模型普遍都是单输入单输出模型,显然,在现实 ...
最新文章
- 【hdu 1043】Eight
- 【目录】 网络瑞士军刀-netcat的秘诀
- Dapr微服务应用开发系列3:服务调用构件块
- python读取hadoop库数据_使用Python访问HDFS
- gatsby_将Gatsby默认启动程序转换为使用样式化组件
- Mac中使用LaTeX的中文字体出现Package fontspec Error: The font “宋体“ cannot be found.解决方案
- 时间预定java,在预定的时间运行任务java,apache
- 便宜可靠的激光雷达可能要来了!Luminar关键部件成本降到3美元
- Cython 的学习
- 第一章:Chrome 43 配置 java + selenium 环境
- eclipse java常用插件_高阶程序员必备25个最好的免费Eclipse插件
- 碰撞检测之 AABB 包围盒
- 隐马尔可夫python_隐马尔可夫模型原理和python实现
- 国美零售带货直播 重构本地零售数字化生产力
- [la P4487] Exclusive-OR
- 第2.2节 串行SPI接口控制PE4312数控衰减器
- JavaScript音频编辑
- Uva 10158 War
- c语言多线程编程随机数,在c 中使用线程安全的随机数,多线程_c_开发99编程知识库...
- Unity3D 实现背包系统