Chinaunix首页 | 论坛 | 博客
  • 博客访问: 692174
  • 博文数量: 192
  • 博客积分: 1875
  • 博客等级: 上尉
  • 技术积分: 2177
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-23 23:21
个人简介

有时候,就是想窥视一下不知道的东东,因为好奇!

文章分类

全部博文(192)

文章存档

2024年(8)

2023年(3)

2020年(1)

2019年(1)

2018年(1)

2017年(2)

2016年(69)

2015年(53)

2014年(14)

2013年(1)

2012年(5)

2011年(25)

2010年(9)

分类: LINUX

2015-08-21 20:56:37

第十五章 发送和接收数据包
15.1 内核的发送/接收函数
        send()/recv(), sendto()/recvfrom(), sendmsg()/recvmsg()
        a. 以上函数经过glibc及内核的宏替换映射到sys_socketcall()系统调用的sys_send()/sys_sendto()/sys_sendmsg()/sys_recv()/sys_recvfrom()/sys_recvmsg()
        b. sys_send()-->sys_sendto()-->sock_sendmsg(). 即3对函数都集中在sock_sendmsg()和sys_recvmsg()
        c. write()/read()对应系统调用sys_write()/sys_read()-->vfs_write()/vfs_read()-->do_sync_write()/do_sync_read()-->sock_aio_write()/sock_aio_read()-->do_sock_write()/do_sock_read()-->......
        .....-->__sock_sendmsg()/__sock_recvmsg()
15.2 客户端发送数据包
        ......
15.3 服务器接收数据包
        tcp_v4_rcv()函数接收数据包.
        tcp_v4_rcv()-->__inet_lookup()
                            -->tcp_prequeue()
                            -->tcp_v4_do_rcv()-->tcp_rcv_established()-->tcp_copy_to_iovec()-->skb_copy_datagram_iovec()-->memcpy_tiovec()
        __inet_lookup()查找用于接收的sock结构
        tcp_prequeue()链入预处理队列
        tcp_v4_do_rcv()处理数据包
        tcp_copy_to_iovec()复制数据包数据到包服务器程序的缓冲区(服务器程序的recv数组)
        memcpy_tiovec()复制数据

        服务器用read(client_fd, recv, 20)函数接收. client_fd是客户端socket文件号
        sys_read()-->vfs_read() -->do_sync_read()-->sock_aio_read()-->__sock_recvmsg()-->sock_common_recvmsg()-->tcp_recvmsg()-->sk_wait_data()
                                                                                                                                                                                                                     -->tcp_prequeue_process()
        sk_wait_data()没有数据包需要我处理, 定时睡眠等待数据包.
        tcp_prequeue_process()预处理队列数据包处理. 依次复制预处理队列的数据包数据到服务器程序中

       ......待深入理解
阅读(903) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~