第八章 接收连接请求
按服务器程序路线分析服务器如何接收客户端的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()函数完成.
阅读(417) | 评论(0) | 转发(0) |