当前位置:  技术问答>linux和unix

linux内核tcp_sendmsg函数的struct kiocb *iocb的作用和,相关打印信息的问题(分值有点少,就这么点了,等赚了再加分)

    来源: 互联网  发布时间:2017-03-13

    本文导语:  各位linux内核高手们:晚辈想请教个问题,(分值有点少,给不出来了,等赚了再加分)用tcp发送数据最终是要到 int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,size_t size)函数里面,但是我在函数代码...

各位linux内核高手们:晚辈想请教个问题,(分值有点少,给不出来了,等赚了再加分)用tcp发送数据最终是要到
int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,size_t size)函数里面,但是我在函数代码里面没有看到参数struct kiocb *iocb的用处,这是何解?我准备在这种加一个压缩算法,对tcp的数据部分进行压缩。但是有些问题,我用ftp发送了3M的文件文件,copied是计算发送了多少数据,copy表示每一次从用户空间复制的数据
int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
        size_t size)
{
   。。。。。
  
    clear_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags);

    mss_now = tcp_send_mss(sk, &size_goal, flags);
    
    /* Ok commence sending. */
    iovlen = msg->msg_iovlen;
    iov = msg->msg_iov;
    copied = 0;

    err = -EPIPE;
    if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN))
        goto out_err;

    sg = sk->sk_route_caps & NETIF_F_SG;
    printk(KERN_INFO " tcp_sendmsg         mss_now=%dn",mss_now);
    printk(KERN_INFO " tcp_sendmsg msg->msg_iovlen=%dn",iovlen);
    
    while (--iovlen >= 0) {
        size_t seglen = iov->iov_len;
        unsigned char __user *from = iov->iov_base;
        printk(KERN_INFO " tcp_sendmsg    iov->iov_len=%dn",iov->iov_len);
        printk(KERN_INFO " tcp_sendmsg    max = size_goal==%dn",size_goal);
        iov++;

        while (seglen > 0) {
            int copy = 0;
            int max = size_goal;
结果显示::
 
Sep  7 14:57:42 ubuntu kernel: [ 2908.250091]  tcp_sendmsg         mss_now=1448
Sep  7 14:57:42 ubuntu kernel: [ 2908.250094]  tcp_sendmsg msg->msg_iovlen=1
Sep  7 14:57:42 ubuntu kernel: [ 2908.250097]  tcp_sendmsg    iov->iov_len=51056
Sep  7 14:57:42 ubuntu kernel: [ 2908.250099]  tcp_sendmsg    max = size_goal==2896
Sep  7 14:57:42 ubuntu kernel: [ 2908.250135]  tcp_sendmsg         mss_now=1448
Sep  7 14:57:42 ubuntu kernel: [ 2908.250137]  tcp_sendmsg msg->msg_iovlen=1
Sep  7 14:57:42 ubuntu kernel: [ 2908.250140]  tcp_sendmsg    iov->iov_len=65536
Sep  7 14:57:42 ubuntu kernel: [ 2908.250142]  tcp_sendmsg    max = size_goal==2896
Sep  7 14:57:42 ubuntu kernel: [ 2908.250152]  tcp_sendmsg         mss_now=1448
Sep  7 14:57:42 ubuntu kernel: [ 2908.250154]  tcp_sendmsg msg->msg_iovlen=1
Sep  7 14:57:42 ubuntu kernel: [ 2908.250156]  tcp_sendmsg    iov->iov_len=65536
Sep  7 14:57:42 ubuntu kernel: [ 2908.250158]  tcp_sendmsg    max = size_goal==2896
Sep  7 14:57:43 ubuntu kernel: [ 2908.301186]  tcp_sendmsg         mss_now=1448
Sep  7 14:57:43 ubuntu kernel: [ 2908.301191]  tcp_sendmsg msg->msg_iovlen=1
Sep  7 14:57:43 ubuntu kernel: [ 2908.301194]  tcp_sendmsg    iov->iov_len=65536
Sep  7 14:57:43 ubuntu kernel: [ 2908.301197]  tcp_sendmsg    max = size_goal==4344
Sep  7 14:57:43 ubuntu kernel: [ 2908.301201]  tcp_sendmsg    copy==1448
Sep  7 14:57:43 ubuntu kernel: [ 2908.301207]  tcp_sendmsg    copy==4344
Sep  7 14:57:43 ubuntu kernel: [ 2908.301211]  tcp_sendmsg    copy==3888
Sep  7 14:57:43 ubuntu kernel: [ 2908.301218]  tcp_sendmsg    copy==4344
Sep  7 14:57:43 ubuntu kernel: [ 2908.301222]  tcp_sendmsg    copy==4136
Sep  7 14:57:43 ubuntu kernel: [ 2908.301228]  tcp_sendmsg    copy==40
Sep  7 14:57:43 ubuntu kernel: [ 2908.301233]  tcp_sendmsg    copy==4344
Sep  7 14:57:43 ubuntu kernel: [ 2908.301238]  tcp_sendmsg    copy==288
Sep  7 14:57:43 ubuntu kernel: [ 2908.301243]  tcp_sendmsg    copy==4344
Sep  7 14:57:43 ubuntu kernel: [ 2908.301248]  tcp_sendmsg    copy==536
Sep  7 14:57:43 ubuntu kernel: [ 2908.301253]  tcp_sendmsg    copy==4344
Sep  7 14:57:43 ubuntu kernel: [ 2908.301258]  tcp_sendmsg    copy==784
Sep  7 14:57:43 ubuntu kernel: [ 2908.301264]  tcp_sendmsg    copied==23168
Sep  7 14:57:43 ubuntu kernel: [ 2908.301319]  tcp_sendmsg         mss_now=1448
Sep  7 14:57:43 ubuntu kernel: [ 2908.301323]  tcp_sendmsg msg->msg_iovlen=1
Sep  7 14:57:43 ubuntu kernel: [ 2908.301326]  tcp_sendmsg    iov->iov_len=65536
Sep  7 14:57:43 ubuntu kernel: [ 2908.301329]  tcp_sendmsg    max = size_goal==4344
Sep  7 14:57:43 ubuntu kernel: [ 2908.301343]  tcp_sendmsg         mss_now=1448
Sep  7 14:57:43 ubuntu kernel: [ 2908.301346]  tcp_sendmsg msg->msg_iovlen=1
Sep  7 14:57:43 ubuntu kernel: [ 2908.301349]  tcp_sendmsg    iov->iov_len=65536
Sep  7 14:57:43 ubuntu kernel: [ 2908.301352]  tcp_sendmsg    max = size_goal==4344
Sep  7 14:57:43 ubuntu kernel: [ 2908.354858]  tcp_sendmsg         mss_now=1448
Sep  7 14:57:43 ubuntu kernel: [ 2908.354862]  tcp_sendmsg msg->msg_iovlen=1
Sep  7 14:57:43 ubuntu kernel: [ 2908.354866]  tcp_sendmsg    iov->iov_len=65536
Sep  7 14:57:43 ubuntu kernel: [ 2908.354869]  tcp_sendmsg    max = size_goal==11584
Sep  7 14:57:43 ubuntu kernel: [ 2908.354872]  tcp_sendmsg    copy==7240
Sep  7 14:57:43 ubuntu kernel: [ 2908.354878]  tcp_sendmsg    copy==3928
Sep  7 14:57:43 ubuntu kernel: [ 2908.354886]  tcp_sendmsg    copy==11584
Sep  7 14:57:43 ubuntu kernel: [ 2908.354889]  tcp_sendmsg    copy==11416
Sep  7 14:57:43 ubuntu kernel: [ 2908.354895]  tcp_sendmsg    copy==7320
Sep  7 14:57:43 ubuntu kernel: [ 2908.354901]  tcp_sendmsg    copy==3224
Sep  7 14:57:43 ubuntu kernel: [ 2908.354908]  tcp_sendmsg    copied==18824
Sep  7 14:57:43 ubuntu kernel: [ 2908.354960]  tcp_sendmsg         mss_now=1448
Sep  7 14:57:43 ubuntu kernel: [ 2908.354963]  tcp_sendmsg msg->msg_iovlen=1
Sep  7 14:57:43 ubuntu kernel: [ 2908.354966]  tcp_sendmsg    iov->iov_len=65536
Sep  7 14:57:43 ubuntu kernel: [ 2908.354969]  tcp_sendmsg    max = size_goal==11584
Sep  7 14:57:43 ubuntu kernel: [ 2908.354983]  tcp_sendmsg         mss_now=1448
Sep  7 14:57:43 ubuntu kernel: [ 2908.354986]  tcp_sendmsg msg->msg_iovlen=1
Sep  7 14:57:43 ubuntu kernel: [ 2908.354989]  tcp_sendmsg    iov->iov_len=65536
Sep  7 14:57:43 ubuntu kernel: [ 2908.354992]  tcp_sendmsg    max = size_goal==11584
Sep  7 14:57:43 ubuntu kernel: [ 2908.364413]  tcp_sendmsg         mss_now=1448
Sep  7 14:57:43 ubuntu kernel: [ 2908.364417]  tcp_sendmsg msg->msg_iovlen=1
Sep  7 14:57:43 ubuntu kernel: [ 2908.364420]  tcp_sendmsg    iov->iov_len=65536
Sep  7 14:57:43 ubuntu kernel: [ 2908.364423]  tcp_sendmsg    max = size_goal==23168
Sep  7 14:57:43 ubuntu kernel: [ 2908.364434]  tcp_sendmsg    copy==11584
Sep  7 14:57:43 ubuntu kernel: [ 2908.364438]  tcp_sendmsg    copy==10712
Sep  7 14:57:43 ubuntu kernel: [ 2908.364445]  tcp_sendmsg    copy==6616
Sep  7 14:57:43 ubuntu kernel: [ 2908.364450]  tcp_sendmsg    copy==2520
Sep  7 14:57:43 ubuntu kernel: [ 2908.364462]  tcp_sendmsg    copy==5792
Sep  7 14:57:43 ubuntu kernel: [ 2908.364467]  tcp_sendmsg    copy==4216
Sep  7 14:57:43 ubuntu kernel: [ 2908.364473]  tcp_sendmsg    copy==120
Sep  7 14:57:43 ubuntu kernel: [ 2908.364477]  tcp_sendmsg    copy==23168
Sep  7 14:57:43 ubuntu kernel: [ 2908.364483]  tcp_sendmsg    copy==19192
Sep  7 14:57:43 ubuntu kernel: [ 2908.364489]  tcp_sendmsg    copy==15096
Sep  7 14:57:43 ubuntu kernel: [ 2908.364494]  tcp_sendmsg    copy==11000
Sep  7 14:57:43 ubuntu kernel: [ 2908.364499]  tcp_sendmsg    copy==6904
Sep  7 14:57:43 ubuntu kernel: [ 2908.364505]  tcp_sendmsg    copy==2808
Sep  7 14:57:43 ubuntu kernel: [ 2908.364515]  tcp_sendmsg    copied==40544
Sep  7 14:57:43 ubuntu kernel: [ 2908.364564]  tcp_sendmsg         mss_now=1448
Sep  7 14:57:43 ubuntu kernel: [ 2908.364567]  tcp_sendmsg msg->msg_iovlen=1
Sep  7 14:57:43 ubuntu kernel: [ 2908.364569]  tcp_sendmsg    iov->iov_len=65536
Sep  7 14:57:43 ubuntu kernel: [ 2908.364571]  tcp_sendmsg    max = size_goal==23168
Sep  7 14:57:43 ubuntu kernel: [ 2908.364630]  tcp_sendmsg         mss_now=1448
Sep  7 14:57:43 ubuntu kernel: [ 2908.364632]  tcp_sendmsg msg->msg_iovlen=1
Sep  7 14:57:43 ubuntu kernel: [ 2908.364635]  tcp_sendmsg    iov->iov_len=65536
Sep  7 14:57:43 ubuntu kernel: [ 2908.364637]  tcp_sendmsg    max = size_goal==23168
Sep  7 14:57:43 ubuntu kernel: [ 2908.364770]  tcp_sendmsg         mss_now=1448
Sep  7 14:57:43 ubuntu kernel: [ 2908.364773]  tcp_sendmsg msg->msg_iovlen=1
Sep  7 14:57:43 ubuntu kernel: [ 2908.364775]  tcp_sendmsg    iov->iov_len=65536
Sep  7 14:57:43 ubuntu kernel: [ 2908.364778]  tcp_sendmsg    max = size_goal==23168
Sep  7 14:57:43 ubuntu kernel: [ 2908.364800]  tcp_sendmsg         mss_now=1448
Sep  7 14:57:43 ubuntu kernel: [ 2908.364802]  tcp_sendmsg msg->msg_iovlen=1
Sep  7 14:57:43 ubuntu kernel: [ 2908.364804]  tcp_sendmsg    iov->iov_len=65536
Sep  7 14:57:43 ubuntu kernel: [ 2908.364807]  tcp_sendmsg    max = size_goal==23168
Sep  7 14:57:43 ubuntu kernel: [ 2908.364817]  tcp_sendmsg         mss_now=1448
Sep  7 14:57:43 ubuntu kernel: [ 2908.364819]  tcp_sendmsg msg->msg_iovlen=1
Sep  7 14:57:43 ubuntu kernel: [ 2908.364822]  tcp_sendmsg    iov->iov_len=65536
Sep  7 14:57:43 ubuntu kernel: [ 2908.364824]  tcp_sendmsg    max = size_goal==23168
Sep  7 14:57:43 ubuntu kernel: [ 2908.364832]  tcp_sendmsg         mss_now=1448
Sep  7 14:57:43 ubuntu kernel: [ 2908.364834]  tcp_sendmsg msg->msg_iovlen=1
Sep  7 14:57:43 ubuntu kernel: [ 2908.364837]  tcp_sendmsg    iov->iov_len=6553
结果显示copied的和是和文件大小一样的,copy的数据我觉得有点无法解释,而且顺序也不完全按照我们平时程序的规则,copy之和应该和iov->iov_len长度一样。
打印顺序应该是 mss_now,msg->msg_iovlen,iov->iov_len,max = size_goal,copy,和copied,怎么顺序乱了
也许我没有理解到linux内核的运作,也许是struct kiocb *iocb的原因了....
各种不懂
忘高手解答!
谢谢大家了!!

|
iocb 应该是用来实现异步调用aio的,看上去Linux socket还没有支持aio,那个参数也就用不上了。

你那个 printk 我是看不懂啦。流程分支很多,你自己仔细检查一下吧。

    
 
 

您可能感兴趣的文章:

  • 开贴加分,求LINUX下FTP客户端源码
  • 我是个linux编程初学者,想请教关于编ppp协议的方法!(加分)
  • 在Linux下用哪种调试工具比较好!(有加分!!!)
  • 在Linux环境下如何安装应用软件?(就这么多分了,问题解决一定追加分)
  • 大家来做linux操作日志。 (愿意加分到300)
  • 寻找LINUX下仿真运行WINDOWS程序的软件和方法?(凡是参与者加分)
  • 关于linux和网络的问题,解决立刻给分!还可以再加分!
  • 新手上路,高分求助学习linux 的好书(还可加分)
  • 关于Linux中对电源管理的支持(解决可加分)
  • 求linux下的jbuilder8的注册机,谢谢?如果有人有的话再加分,免得浪费,最高100分
  • <help!!急!!!>请问如何将一linux机与一Windows 9X机互连?保证加分!!!!!
  • 深入理解linux内核第三版中文版 不够可以再加分
  • 关于在linux下"通过ip地址获取它的主机名"谁有比较好的函数或例子,谢谢,加分!
  • 在linux下编程,有没有类似Windows下的MSDN的帮助,如果有哪儿能找到或者下到。言者有分,有帮助者再加分
  • 菜鸟分值天天送之--linux下编程的小问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux内核中影响tcp三次握手的一些协议配置
  • 我想学习linux桌面编程,那么有没有必要学习linux的内核以及内核的相关编程呢?
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项
  • 现有linux内核中共享内存机制如何移植到linux0.11内核中
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • 读懂 Linux 内核代码不难,难的是读懂 Linux 内核代码背后的哲学!
  • linux内核中的likely宏和unlikely宏介绍及用法
  • Linux中内核线程不访问内核态地址空间?
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • linux为什么要升级内核?升级内核有何作用?
  • 请问linux中如何判断内核是否已经启动。(在内核中写程序)
  • 《Linux内核情景分析》值得推荐的内核学习参考两用资料
  • *******是不是对内核模块编程然后再重新编译内核就可以把此模块整合到linux系统中
  • Linux 编译内核之后 没办法选择内核版本
  • 想看linux内核源代码,另外手头上有一本《unix环境高级编程》,需要先把《unix环境高级编程》看完之后再看内核吗?
  • 请问重新编译LINUX内核是否能将没有用的外设的驱动程序删除并减少内核占有内存的资源?请好心人仕指教!
  • Linux内核工具包 TOMOYO Linux
  • 请问:构建嵌入式linux环境时,“Linux内核的移植”是达到什么目的啊?
  • 求教,Linux下键盘输入的所有数据都会经过Linux内核吗???
  • 高深问题:有了linux内核源代码如何做成一个linux操作系统
  • linux内核编译一定要在linux环境下么?
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3