socket 系统调用

时间:2019-12-19
本文章向大家介绍socket 系统调用,主要包括socket 系统调用使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

在Linux里面,可通过创建Socket,使得进程之间进行网络通信,可通过TCP或者UDP的方式进行交互。

 查看inet_stream_ops结构会发现,其中包含了各种socket系统调用的对应的处理函数;

1 const struct proto_ops inet_stream_ops = {
 2     .family           = PF_INET,
 3     .owner           = THIS_MODULE,
 4     .release       = inet_release,
 5     .bind           = inet_bind,
 6     .connect       = inet_stream_connect,
 7     .socketpair       = sock_no_socketpair,
 8     .accept           = inet_accept,
 9     .getname       = inet_getname,
10     .poll           = tcp_poll,
11     .ioctl           = inet_ioctl,
12     .listen           = inet_listen,
13     .shutdown       = inet_shutdown,
14     .setsockopt       = sock_common_setsockopt,
15     .getsockopt       = sock_common_getsockopt,
16     .sendmsg       = inet_sendmsg,
17     .recvmsg       = inet_recvmsg,
18     .mmap           = sock_no_mmap,
19     .sendpage       = inet_sendpage,
20     .splice_read       = tcp_splice_read,
21     .read_sock       = tcp_read_sock,
22     .peek_len       = tcp_peek_len,
23 #ifdef CONFIG_COMPAT
24     .compat_setsockopt = compat_sock_common_setsockopt,
25     .compat_getsockopt = compat_sock_common_getsockopt,
26     .compat_ioctl       = inet_compat_ioctl,
27 #endif
28 };

scoket系统调用主要完成socket的创建,必要字段的初始化,关联传输控制块,绑定文件等任务,完成返回socket绑定的文件描述符;

/**
 * socket函数调用关系
 * sys_socket
 *   |-->sock_create
 *   |      |-->__sock_create
 *   |            |-->inet_create           
 *   |-->sock_map_fd
 */

以tcp的socket calls为例:

 
 下面来分析sock_create流程,其主要工作为创建socket,并进行必要的初始化;

int sock_create(int family, int type, int protocol, struct socket **res)
{
    return __sock_create(current->nsproxy->net_ns, family, type, protocol, res, 0);
}

__socket_create函数负责必要的检查项,创建socket,必要的初始化,之后调用对应协议族的pf->create函数来创建传输控制块,并且与socket进行关联;

原文地址:https://www.cnblogs.com/lambdoor/p/12069907.html