内核中的UDP socket流程(1) 
相对于TCP,UDP协议要简单的多。所以我决定由简入繁,先从UDP协议入手。
前一遍文章已经确定了struct sk_buff被用于socket的接受和发送缓冲。那么为了摸清linux发送数据的流程,我们就可以顺着socket中的变量sk_write_queue来从最上层的发送函数开始,一直追溯到最底层。
在追溯的过程中,我一直向上遍历到socket层。那么就从UDP socket开始进行从上到下的展示。
socket的主要处理函数都在linux/net/socket.c的文件中。
对于UDP socket来说,用户空间涉及到的API,一般常用的是socket,sendto,recvfrom,close。当然,如果还有同样是用于发送的write,send,用于接受的read,recv等等,但都大同小异。
所以,这里只研究socket,send,recv和close
Linux中的API都是使用宏SYSCALL_DEFINEx作为前缀的,其中x是该API的参数的个数。在此我并不研究这个宏是如何实现的,因为那个不是TCP/IP的重点。————有兴趣的朋友可以自己去看该宏的定义。SYSCALL_DEFINE位于linux/include/linux/syscalls.h中。
这里我们只需要记住,其中的x是API参数的个数,而该宏的第一个参数,就是API的名字——这样我们就可以很方便的找到用户空间API对应的Linux内核中的代码了。
1. 这个是API socket的定义

SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)

2. 这个是API sendto的定义

SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,

unsigned, flags, struct sockaddr __user *, addr,

int, addr_len)

3. 这个是API recvfrom的定义

SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t size,
        unsigned, flags, struct sockaddr __user *, addr,
        int __user *, addr_len)

第4个API close与前面三个API不同。对于用户空间的程序来说, socket返回的值同样是被当做文件描述符fd的————对于Linux来说,这是linux的一大特征,用虚拟文件层去封装底层的复杂性。无论是设备,还是socket,都可以看做文件,而在代码实现上也是如此。因为我对VFS并不熟悉,只知道大概原理,所以再细的东西我也不清楚,以后可以研究一下。
那么对于socket来说,必然有一套符合文件操作的接口。请看下面的代码

static const struct file_operations socket_file_ops = {
    .owner =    THIS_MODULE,
    .llseek =    no_llseek,
    .aio_read =    sock_aio_read,
    .aio_write =    sock_aio_write,
    .poll =        sock_poll,
    .unlocked_ioctl = sock_ioctl,
#ifdef CONFIG_COMPAT
    .compat_ioctl = compat_sock_ioctl,
#endif
    .mmap =        sock_mmap,
    .open =        sock_no_open,    /* special open code to disallow open via /proc */
    .release =    sock_close,
    .fasync =    sock_fasync,
    .sendpage =    sock_sendpage,
    .splice_write = generic_splice_sendpage,
    .splice_read =    sock_splice_read,
};

看到这里,我们都不需要去查看struct file_operations的定义,就可以判断出socket的close动作必然是调用了sock_close。

那么 
4. 这个就是API close(对于socket)的定义

static int sock_close(struct inode *inode, struct file *filp)

内核中的UDP socket流程(1)相关推荐

  1. 内核中的UDP socket流程(2)——API “sys_socket”

    内核中的UDP socket流程(2)--API "sys_socket" 作者:gfree.wind@gmail.com 原文:http://blog.chinaunix.net ...

  2. 内核中的UDP socket流程(7)——udp_sendmsg

    sock_sendmsg的代码很简单 int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) { struct k ...

  3. 内核中的UDP socket流程(5)——inet_create

    进入函数inet_create static int inet_create(struct net *net, struct socket *sock, int protocol,           ...

  4. 内核中的UDP socket流程(3)(4)——sock_create

    好了,闲话少说.上次看到了sys_socket调用sock_create的地方了.下面开始研究sock_create了. sys_socket将自己的参数family, type, protocol传 ...

  5. 内核中的UDP socket流程(6)——sendto

    现在开始新的API sendto,那么就重新回到了socket.c文件. SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, l ...

  6. 内核中的UDP socket流程(11)——ip_append_data

    作者:gfree.wind@gmail.com 博客:linuxfocus.blog.chinaunix.net 继续ip_append_data, if (copy > length) cop ...

  7. 一文讲解Linux内核中根文件系统挂载流程

    根文件系统的概念 根文件系统是控制权从linux内核转移到用户空间的一个桥梁.linux内核就类似于一个黑匣子,只向用户提供各种功能的接口,但是功能的具体实现不可见,用户程序通过对这些功能接口的不同整 ...

  8. linux程序获取透传参数,Linux内核中TCP SACK处理流程分析

    frankzfz2014-07-27 17:32 demo121:frankzfz您好: 我想请教一个问题,就是将写好的GenericApp项目(没有配置工具),我加入zigbee协议栈的配置工具后还 ...

  9. Linux内核网络协议栈8—socket监听

    几个问题  了解以下几个问题的同学可以直接忽略下文: 1.listen 库函数主要做了什么?  2. 什么是最大并发连接请求数?  3.什么是等待连接队列? socket 监听相对还是比较简单的,先看 ...

最新文章

  1. 行业操作系统行业深度报告 华为鸿蒙系统,操作系统行业深度报告:华为鸿蒙系统、安卓和未来.docx...
  2. onclick 获取点击之后的img 的id_前端,点击按钮跳出视频带蒙层,且视频永远居于屏幕中间...
  3. <Module>的类型初始值设定项引发异常
  4. python中的散点图代码-python – 带有图例的matplotlib散点图
  5. c语言使用函数累加由n个a构成的整数之和,c 语言使用函数累加由n个a构成的整数之和...
  6. POJ - 1847 Tram(最短路)
  7. 银行假流水怎么识破?
  8. python 离散数据时间序列图_每个人都学的会的数据分析
  9. 我们不再需要 Chrome?
  10. 基于python的电商评论分析_Python实现爬取并分析电商评论
  11. 【python】速查手册(基础笔记) - 人生苦短,我用python
  12. 斐讯k3怎么设置虚拟服务器,斐讯K3路由器功能介绍及使用教程
  13. emWin6.12模拟器发布,更新内容较多,增加环形控件,WIFI二维码(2020-04-09)
  14. 用了三星Dex,我已经快一个月回家没开过电脑了
  15. Python0基础(中)——期末不挂科
  16. 网站调用百度地图展示位置,调用百度开放平台api 动态静态调用
  17. vue-pdf插件不翻页预览
  18. 算法——实现随机拿到30道不重复的20以内的加减法题目
  19. 欧奈尔的杯柄形态理论(技术干货)
  20. mysql命令行配置

热门文章

  1. 使用学习曲线(Learning curve),判断机器学习模型过拟合、欠拟合,与解决过拟合、欠拟合的问题
  2. jupyter配置不同的conda环境
  3. Linux查询端口的任务
  4. Linux安装wireshark并配置权限
  5. java爬虫爬取主流房屋网站
  6. python 鱼骨图_面向对象编程,鱼骨图分析法
  7. 平常代码练习报错问题解决
  8. jquery中prop()和attr()的使用
  9. phpcms二层栏目下拉和当前栏目高亮
  10. Pair Project:电梯控制程序 编写心得 最新版