首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux内核2.4.x的网络接口源码的结构[转](3)

Linux内核2.4.x的网络接口源码的结构[转](3)

我们看到这种映射是通过ops,和prot来映射的,我们再来看看 tcp_prot这一项:

  struct proto tcp_prot = {
  name: "TCP",
  close: tcp_close,
  connect: tcp_v4_connect,
  disconnect: tcp_disconnect,
  accept: tcp_accept,
  ioctl: tcp_ioctl,
  init: tcp_v4_init_sock,
  destroy: tcp_v4_destroy_sock,
  shutdown: tcp_shutdown,
  setsockopt: tcp_setsockopt,
  getsockopt: tcp_getsockopt,
  sendmsg: tcp_sendmsg,
  recvmsg: tcp_recvmsg,
  backlog_rcv: tcp_v4_do_rcv,
  hash: tcp_v4_hash,
  unhash: tcp_unhash,
  get_port: tcp_v4_get_port,
  };


  所以的映射都已经完成了,用户调用connect()函数,其实就是调用了tcp_v4_connect()函数,按照这幅图,读起源码来就简单了很多了。

  六 Socket层

  上一节把socket层大多数要讨论的东西都谈论了,现在只讲讲socket 层和用户的衔接。

  系统调用socket(),bind(),connect(),accept,send(),release()等是在Linux/net/socket.c里面的实现的,系统调用实现的函数是相应的函数名加上sys_的前缀。

  现在看看当用户调用socket()这个函数,到底下面发生了什么。

  Socket(AF_INET,SOCK_STREAM,0)调用了sys_socket(),sys_socket()接着调用socket_creat(),socket_creat()就要根据用户提供的协议族参数在net_families[]里寻找合适的协议族,如果协议族没有被安装就要请求安装该协议族的模块,然后就调用该协议族的create()函数的处理句柄。根据参数AF_INET,inet_creat()就被调用了,在inet_creat()根据服务类型在inetsw[SOCK_MAX]

  选择合适的协议,并把协议的操作集赋给socket就是了,根据SOCK_STREAM,TCP协议被选中,
  inet_creat(){
  answer=inetsw [用户要求服务服务] ;
  sock->ops = answer->ops;
  sk->prot = answer->prot
  }

  到此为止,上下都打通了,该是大家都源码的时候了。
继承事业,薪火相传
返回列表