首页 > 系统相关 >Linux UDP协议栈中的片段分析 - udp_recvmsg

Linux UDP协议栈中的片段分析 - udp_recvmsg

时间:2023-06-15 14:02:56浏览次数:57  
标签:UDP struct int iov iovec len recvmsg Linux copy



  1. udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct
  2. size_t len, int noblock, int flags, int

调用了:


  1. err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov,copied);

调用了:



  1. memcpy_toiovec(to, skb->data + o, copy);

调用了:



  1. /*
  2.  *  Copy kernel to iovec. Returns -EFAULT on error.
  3.  *
  4.  *  Note: this modifies the original iovec.
  5.  */
  6.  
  7. int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int
  8. {
  9. while
  10. if
  11. int copy = min_t(unsigned int, iov->iov_len, len);
  12. if
  13. return
  14.             kdata += copy;
  15.             len -= copy;
  16.             iov->iov_len -= copy;
  17.       iov->iov_base += copy;
  18.         }
  19.         iov++;
  20.     }

  21. return
  22. }





在udp_recvmsg中,随着不断地recv,内部会自动修改iov->iov_base,也就是说,在内核态,多个消息可以累积接收的。



这一点正是我们曾经期待过而又否定过的。





期待在于:如果内部能一次性收多个包,那么就可以大大节省系统调用开销了。



否定在于:系统如何知晓数据的结构呢?比如每个包的大小等。OS提供的接口属于通用型接口,不能期望它做太多的优化。





现在好了,在内核态,如果添加适当的协议及数据头,就可以让系统一次性收多个数据包,然后一次性返回给用户层!





Very Nice~





要点:提供足够缓冲区、设计适当的数据头(由发送端打包)







标签:UDP,struct,int,iov,iovec,len,recvmsg,Linux,copy
From: https://blog.51cto.com/u_16162111/6486731

相关文章

  • django 实现linux运维管理平台
    概述使用django实现一个linux运维管理平台,可以实现注册登录,机器管理,服务器批量操作,服务器性能监控。详细一、准备工作1、需要准备什么环境我是在自己的云服务上编写和运行的,centos7.2的环境,python是系统自带的python2.7.5,django安装的1.8.5版本的。数据库使用的mysql......
  • Linux系统,使用crontab定时执行备份脚本后,备份为空的解决方案
    使用crontab执行备份.sh脚本后备份为空,但是自己手动执行是没问题的参考[(163条消息)定时任务执行mysql备份脚本备份结果为空_mysql备份脚本日期有空格怎么回事_玉无暇的博客-CSDN博客](https://blog.csdn.net/weixin_51009330/article/details/120431278#:~:text=用crontab,自......
  • 【技术积累】Linux中的基础知识【一】
    Linux系统是什么Linux系统是一种开源操作系统,它极具可定制性和灵活性,因此受到了许多人的欢迎。Linux系统以简单,强大和兼容性而著称。它可用于各种设备,从个人计算机到超级计算机,从移动设备到智能家居。Linux系统遵循GNU公共许可证(GPL)下的自由和开源软件原则,这......
  • Linux 设置 VI 快捷键 -- 在多个打开的文件中切换
    场景部署完一系列服务后,想要查看所有服务的catelina.out日志:vi$(find/data/http|grepcatalina.out|grep-vbak)这个命令会打开所有匹配的文件,想要切换下一个文件,可以使用vi自带的命令为:bn或者:bp能否设置快捷键操作呢,显然是可以的:vi~/.vimrc添加:noremap<Tab......
  • Linux 基础 VI 编辑器
    目录一、vi的基本概念1.1命令行模式(commandmode)1.2插入模式(Insertmode)1.3底行模式(lastlinemode)二、vi的基本操作2.1进入vi(重要)2.2切换至插入模式(Insertmode)编辑文件(重要)2.3Insert的切换(重要)2.4退出vi及保存文件(重要)三、命令行模式(commandmode)功能键3.1......
  • linux 常用命令
    (1)通过端口查询进程netstat-nlp|grep5672 ps-ef|grep 1085639 ......
  • linux_11 个很少人知道但很有用的 Linux 命令
    via: http://linux.cn/thread/11931/1/1/1.sudo!!命令没有特定输入sudo命令而运行,将给出没有权限的错误。那么,你不需要重写整个命令,仅仅输入'!!'就可以抓取最后的命令。·········10········20········30········40········50···......
  • 【linux命令】 top命令解析
    第一行:任务队列信息(uptime命令相同)分别是当前系统时间、系统运行了多久、登录了几个用户、loadaverage分别是1分钟、5分钟、15分钟的平均负载情况第二行:Tasks为任务(进程),下图得知:一共136个进程,运行了2个、134个正在休眠、0个停止状态、0个僵死进程第三行:CPU状态信息,us是用户空......
  • Qt编写精美输入法(历时十年迭代/可换肤/支持Qt4/5/6/win/linux/mac/嵌入式等)
    一、前言大概是从2012年就开始研究用Qt写输入法,因为项目需要,嵌入式板子上,没有对应的输入法,当初使用过很多NVR,里面也是鼠标按下弹出输入法面板进行输入,可以切换数字和字母及中文,于是借鉴着操作交互流程,用纯QWidget代码实现一个,当然最初的版本是非常简单和丑陋的,而且功能单一,能打字......
  • ARM Linux 系统设置开机自启动一个程序
    原文:https://blog.csdn.net/weixin_45157820/article/details/119906809前言在之前做项目的时候,他是一个智能拨号模块,是一个单独运行的程序,在ARM开发板上每次重启之后,需要自己再去手动运行一次,这个时候我们想到既然他是智能拨号模块,那就要实现一个全自动的,也就是开......