TCP/IP源码学习(49)——socket与VFS的关联(3)

简介: 作者:gfree.wind@gmail.com 博客:blog.focus-linux.net   linuxfocus.blog.chinaunix.net  本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。
作者:gfree.wind@gmail.com
博客:blog.focus-linux.net   linuxfocus.blog.chinaunix.net
 
 
本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
======================================================================================================
在sock_alloc_file成功返回后,回到函数sock_map_fd中
  1. int sock_map_fd(struct socket *sock, int flags)
  2. {
  3.     struct file *newfile;
  4.     int fd = sock_alloc_file(sock, &newfile, flags);

  5.     if (likely(fd >= 0))
  6.         fd_install(fd, newfile);

  7.     return fd;
  8. }
这时,sock->file = new_file, 而newfile->private_data = sock,也就是sock已经和file互相关联起来,file的各种文件操作也指向socket的各种操作。但是与fd还没有建立起联系。当sock_alloc_file成功返回时,fd自然大于等于0,进入函数fd_install,这个函数将把文件描述符fd与文件结构file关联。自然通过file,fd与socket也就关联起来。

  1. //这个函数很简单
  2. void fd_install(unsigned int fd, struct file *file)
  3. {
  4.     /* 得到当前进程的文件表 */
  5.     struct files_struct *files = current->files;
  6.     struct fdtable *fdt;
  7.     spin_lock(&files->file_lock);
  8.     /* 获得文件描述符表 */
  9.     fdt = files_fdtable(files);
  10.     BUG_ON(fdt->fd[fd] != NULL);
  11.     /* 将新建立的file结构赋给对应的文件描述符为索引的指针 */
  12.     rcu_assign_pointer(fdt->fd[fd], file);
  13.     spin_unlock(&files->file_lock);
  14. }
ok。这时已经完成了,socket,fd,和file三者的关联。

简单描述一下三者之间的关联。
每个进程维护了一个打开的文件表,可使用current->files得到,该结构如下:
  1. /*
  2.  * Open file table structure
  3.  */
  4. struct files_struct {
  5.   /*
  6.    * read mostly part
  7.    */
  8.     atomic_t count
  9.     struct fdtable *fdt; //文件描述符表
  10.     struct fdtable fdtab;//这个我不知道用途是做什么
  11.   /*
  12.    * written part on a separate cache line in SMP
  13.    */
  14.     spinlock_t file_lock ____cacheline_aligned_in_smp;
  15.     int next_fd;
  16.     struct embedded_fd_set close_on_exec_init;
  17.     struct embedded_fd_set open_fds_init;
  18.     //实现申请的默认个数的file指针
  19.     struct file * fd_array[NR_OPEN_DEFAULT];
  20. };
通过文件描述符,可以得到内部的文件结构体current->files->fdt->fd[socket_fd]——其中socket_fd为传入的文件描述符。由于在创建socket的时候,已经将文件的各种操作函数,绑定到socket的各种操作函数。这样,当使用socket返回的文件描述符,进行各种文件操作,实际上就是对socket执行各种socket指定的操作。

目录
相关文章
|
5月前
|
网络协议 安全 网络安全
网络编程:基于socket的TCP/IP通信。
网络编程:基于socket的TCP/IP通信。
297 0
|
7月前
|
网络协议 安全 Java
Java网络编程入门涉及TCP/IP协议理解与Socket通信。
【6月更文挑战第21天】Java网络编程入门涉及TCP/IP协议理解与Socket通信。TCP/IP协议包括应用层、传输层、网络层和数据链路层。使用Java的`ServerSocket`和`Socket`类,服务器监听端口,接受客户端连接,而客户端连接指定服务器并交换数据。基础示例展示如何创建服务器和发送消息。进阶可涉及多线程、NIO和安全传输。学习这些基础知识能助你构建网络应用。
55 1
|
7月前
|
开发框架 网络协议 Unix
【嵌入式软件工程师面经】Socket,TCP,HTTP之间的区别
【嵌入式软件工程师面经】Socket,TCP,HTTP之间的区别
71 1
|
3月前
|
网络协议 Linux 网络性能优化
Linux基础-socket详解、TCP/UDP
综上所述,Linux下的Socket编程是网络通信的重要组成部分,通过灵活运用TCP和UDP协议,开发者能够构建出满足不同需求的网络应用程序。掌握这些基础知识,是进行更复杂网络编程任务的基石。
185 1
|
8月前
|
网络协议 Java
Java的Socket编程:TCP/IP与UDP深入探索
Java的Socket编程:TCP/IP与UDP深入探索
119 0
|
5月前
|
网络协议 Java
一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例
这篇文章全面讲解了基于Socket的TCP网络编程,包括Socket基本概念、TCP编程步骤、客户端和服务端的通信过程,并通过具体代码示例展示了客户端与服务端之间的数据通信。同时,还提供了多个案例分析,如客户端发送信息给服务端、客户端发送文件给服务端以及服务端保存文件并返回确认信息给客户端的场景。
一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例
|
4月前
|
网络协议 Linux
TCP 和 UDP 的 Socket 调用
【9月更文挑战第6天】
|
6月前
|
网络协议 程序员 定位技术
学习网络的第一步:全面解析OSI与TCP/IP模型
**网络基础知识概览:** 探索网络通信的关键模型——OSI七层模型和TCP/IP五层模型。OSI模型(物理、数据链路、网络、传输、会话、表示、应用层)提供理论框架,而TCP/IP模型(物理、数据链路、网络、传输、应用层)更为实际,合并了会话、表示和应用层。两者帮助理解数据在网络中的传输过程,为网络设计和管理提供理论支持。了解这些模型,如同在复杂的网络世界中持有了地图。
110 2
|
6月前
|
网络协议 Java
如何在Java中使用Socket编程实现TCP连接?
在Java中,通过Socket编程实现TCP连接非常常见。以下演示了基本的TCP通信流程,可根据具体需求进行扩展。
329 0
|
7月前
|
网络协议 应用服务中间件 网络性能优化
解析TCP /UDP协议的 socket 调用的过程
【6月更文挑战第2天】该文介绍了传输层的两种主要协议TCP和UDP的区别。TCP是面向连接、可靠的,提供顺序无错的数据传输,而UDP则是无连接、不可靠的,不保证数据顺序或不丢失。

热门文章

最新文章