1008
技術社區[雲棲]
網絡子係統76_套接字綁定
// 綁定套接字到地址 // 步驟: // 1.根據用戶空間的文件描述符查找socket描述符 // 2.複製地址信息到內核空間 // 3.由具體的協議族完成綁定 1.1 SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen) { struct socket *sock; struct sockaddr_storage address; int err, fput_needed; //通過用戶空間文件描述符查找socket描述符 sock = sockfd_lookup_light(fd, &err, &fput_needed); if (sock) { //複製用戶空間的地址信息到內核 err = move_addr_to_kernel(umyaddr, addrlen, &address); //由具體的協議層完成綁定 sock->ops->bind(sock, (struct sockaddr *)&address, addrlen); fput_light(sock->file, fput_needed); } return err; } // 根據用戶空間文件描述符查找socket描述符 // 步驟: // 1.交由文件係統通過用戶空間的文件描述符查找struct file結構 // 2.file->private_data指向socket結構 2.1 static struct socket *sockfd_lookup_light(int fd, int *err, int *fput_needed) { struct file *file; struct socket *sock; *err = -EBADF; //由文件係統查找文件描述符 file = fget_light(fd, fput_needed); if (file) { //file->private_data指向socket結構 sock = sock_from_file(file, err); if (sock) return sock; fput_light(file, *fput_needed); } return NULL; }
最後更新:2017-04-03 12:55:16