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
- 腾讯云GAME-TECH沙龙干货回顾:网龙《英魂之刃口袋版》开发经验分享
- ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则
- 【深度学习系列】用PaddlePaddle和Tensorflow实现经典CNN网络AlexNet
- 黄荣奎:如何快速、便捷开发小程序
- 熊普江: BGP网络架构助力开发者快速构建、优化业务
- 唐良:云端架构给电商行业带来创新力
- 邹方明:看腾讯云如何架构海量存储系统
- 王之捷:AI智能云端架构大幅提升智能语音识别能力
- 精彩大放送 | 腾讯云:容器架构向无服务架构的演进
- Python 数据分析学习笔记
- 如何用Fiddler抓取https
- 人工智能与大数据结合,帮助降低自杀率
- “多态”的数据库连接池实现
- ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidatorProvider
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 详解Docker中Image、Container与 Volume 的迁移
- 浙大版《C语言程序设计(第3版)》题目集 习题8-1 拆分实数的整数与小数部分
- 如何在 Linux 上恢复误删除的文件或目录
- 浙大版《C语言程序设计(第3版)》题目集 习题8-2 在数组中查找指定元素
- Pandas学习笔记之时间序列总结
- HTML+JS动态获取当前时间
- HTML+JS实现时钟
- SQL-spj库创建脚本
- Sublime Text3 通过Package Control安装插件时找不到可用安装包的解决方法
- SwiftUI:手动发布 ObservableObject 更改
- 卧槽,又一款 Markdown 组合神器!!!
- SQL-查询各工程项目使用所提供零件最多的供应商
- 浙大版《C语言程序设计(第3版)》题目集 习题8-3 数组循环右移
- SwiftUI:控制图像插值
- SQL-查询比p6零件供应数量都高的零件