先看一下socket系统调用涉及的相关流程:
int socket(int domain, int type, int protocol);
domain指定协议族,protocol family,如:
-
/* Supported address families. */
-
#define AF_UNSPEC 0
-
#define AF_UNIX 1 /* Unix domain sockets */
-
#define AF_LOCAL 1 /* POSIX name for AF_UNIX */
-
#define AF_INET 2 /* Internet IP Protocol */
-
#define AF_AX25 3 /* Amateur Radio AX.25 */
type指定具体的应用类型,如下,同时类型比较少,一个字节就可以表示完,因此type字段还有附加作用,用于传递SOCK_CLOEXEC,SOCK_NONBLOCK选项。
-
enum sock_type {
-
SOCK_STREAM = 1,
-
SOCK_DGRAM = 2,
-
SOCK_RAW = 3,
-
SOCK_RDM = 4,
-
SOCK_SEQPACKET = 5,
-
SOCK_DCCP = 6,
-
SOCK_PACKET = 10,
-
}
protocol指定具体的协议,一般前面两项已经能够确定了,这时写0就可以了。
linux把socket当作一种文件系统,在sock_init中涉及相关的初始化,sock_mnt在socket系统调用的时候会用于分配socket数据结构,同时在inet_init中会注册相应的协议:
-
static struct socket *sock_alloc(void)
-
{
-
struct inode *inode;
-
struct socket *sock;
-
-
inode = new_inode_pseudo(sock_mnt->mnt_sb); //sock_alloc_inode
-
if (!inode)
-
return NULL;
-
-
sock = SOCKET_I(inode);
-
-
kmemcheck_annotate_bitfield(sock, type);
-
inode->i_ino = get_next_ino();
-
inode->i_mode = S_IFSOCK | S_IRWXUGO;
-
inode->i_uid = current_fsuid();
-
inode->i_gid = current_fsgid();
-
-
percpu_add(sockets_in_use, 1);
-
return sock;
-
}
sock_alloc_inode会分配struct socket_alloc数据结构,该数据结构包含socket以及inode数据结构的大小
在inet_create函数中会分配sock数据结构相关的内存:
在函数sock_map_fd中会分配新的文件句柄,然后和socket关联起来
阅读(3001) | 评论(0) | 转发(0) |