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

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

文章分类

全部博文(186)

文章存档

2024年(2)

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-02 21:27:44

第八章 接收连接请求
        按服务器程序路线分析服务器如何接收客户端的socket连接请求
       
8.1 接收连接函数
        accept()-->sys_socketcall()-->sys_accept()-->inet_accept()-->inet_csk_accept()-->inet_csk_wait_for_connect()-->prepare_to_wait_exclusive()     
        sys_accept()函数总的作用是建立服务器与客户端通信的"桥梁", 为客户端创建一个socket, 并在网络文件系统中为它申请文件号和文件结构,最后返回客户端的文件号client_sockfd和客户端地址client_address.
8.2 异步接收方式
        服务器程序采用异步接收的方式, 那么在没有连接请求的情况下,服务器程序进程可以继续运行执行其它任务;当客户端的连接请求到来时, 内核会异步发送信号通知服务器的程序进程接受连接请求.
        /** 异步接收设置 **/
        int on = 1; ioctl(server_fd, FIOASYNC, &on);
        /** 指定服务器程序进程作为socket文件所有者 **/
        fcntl(server_fd, FSETOWN, getpid());
        ioctl()-->sys_ioctl()-->do_vfs_ioctl()-->ioctl_fioasync()-->sock_fasync()
        创建一个异步结构链入socket的异步队列中, 连接到来时,内核通过sk_wake_async()唤醒服务程序进程.
        !!!!!!!!!!!!!!!!!!待深入分析
8.3 获取连接请求
        sys_socketcall()-->sys_accept()-->inet_accept()-->sock_graft()
                                                           -->inet_getname()-->inet_sk()
        sock_graft()将客户端的socket与sock成功对接,自此在服务器中newsock就代表客户端的socket
        inet_getname()函数将客户端端口和地址记录在address数组, 将这些地址信息传回给服务器程序, 地址结构变量client_address将接收这些内容, 传回过程由move_addr_to_user()函数完成.
阅读(380) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~