Chinaunix首页 | 论坛 | 博客
  • 博客访问: 85789
  • 博文数量: 15
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 210
  • 用 户 组: 普通用户
  • 注册时间: 2014-01-05 15:27
文章分类

全部博文(15)

文章存档

2014年(15)

我的朋友

分类: LINUX

2014-02-09 16:55:57


先看一下socket系统调用涉及的相关流程:

int socket(int domain, int type, int protocol);
domain指定协议族,protocol family,如:
  1. /* Supported address families. */
  2. #define AF_UNSPEC    0
  3. #define AF_UNIX        1    /* Unix domain sockets         */
  4. #define AF_LOCAL    1    /* POSIX name for AF_UNIX    */
  5. #define AF_INET        2    /* Internet IP Protocol     */
  6. #define AF_AX25        3    /* Amateur Radio AX.25         */
type指定具体的应用类型,如下,同时类型比较少,一个字节就可以表示完,因此type字段还有附加作用,用于传递SOCK_CLOEXEC,SOCK_NONBLOCK选项。
  1. enum sock_type {
  2.     SOCK_STREAM    = 1,
  3.     SOCK_DGRAM    = 2,
  4.     SOCK_RAW    = 3,
  5.     SOCK_RDM    = 4,
  6.     SOCK_SEQPACKET    = 5,
  7.     SOCK_DCCP    = 6,
  8.     SOCK_PACKET    = 10,
  9. }
protocol指定具体的协议,一般前面两项已经能够确定了,这时写0就可以了


linux把socket当作一种文件系统,在sock_init中涉及相关的初始化,sock_mnt在socket系统调用的时候会用于分配socket数据结构,同时在inet_init中会注册相应的协议:



  1. static struct socket *sock_alloc(void)
  2. {
  3.     struct inode *inode;
  4.     struct socket *sock;

  5.     inode = new_inode_pseudo(sock_mnt->mnt_sb);  //sock_alloc_inode
  6.     if (!inode)
  7.         return NULL;

  8.     sock = SOCKET_I(inode);

  9.     kmemcheck_annotate_bitfield(sock, type);
  10.     inode->i_ino = get_next_ino();
  11.     inode->i_mode = S_IFSOCK | S_IRWXUGO;
  12.     inode->i_uid = current_fsuid();
  13.     inode->i_gid = current_fsgid();

  14.     percpu_add(sockets_in_use, 1);
  15.     return sock;
  16. }
sock_alloc_inode会分配struct socket_alloc数据结构,该数据结构包含socket以及inode数据结构的大小
在inet_create函数中会分配sock数据结构相关的内存:

在函数sock_map_fd中会分配新的文件句柄,然后和socket关联起来

阅读(3001) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~