内核中的UDP socket流程(2)——API “sys_socket”

简介: 内核中的UDP socket流程(2)——API “sys_socket”作者:gfree.wind@gmail.com原文:http://blog.chinaunix.

内核中的UDP socket流程(2)——API “sys_socket”

作者:gfree.wind@gmail.com

前面已经列出了UDP常用的4个API,那么下面从第一个API “sys_socket”开始

1272 SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
1273 {
1274     int retval;
1275     struct socket *sock;
1276     int flags;
1277
1278     /* Check the SOCK_* constants for consistency. */
1279     BUILD_BUG_ON(SOCK_CLOEXEC != O_CLOEXEC);
1280     BUILD_BUG_ON((SOCK_MAX | SOCK_TYPE_MASK) != SOCK_TYPE_MASK);
1281     BUILD_BUG_ON(SOCK_CLOEXEC & SOCK_TYPE_MASK);
1282     BUILD_BUG_ON(SOCK_NONBLOCK & SOCK_TYPE_MASK);
1283
1284     flags = type & ~SOCK_TYPE_MASK;
1285     if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
1286         return -EINVAL;
1287     type &= SOCK_TYPE_MASK;
1288
1289     if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
1290         flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
1291
1292     retval = sock_create(family, type, protocol, &sock);
1293     if (retval 0)
1294         goto out;
1295
1296     retval = sock_map_fd(sock, flags & (O_CLOEXEC | O_NONBLOCK));
1297     if (retval 0)
1298         goto out_release;
1299
1300 out:
1301     /* It may be already another descriptor 8) Not kernel problem. */
1302     return retval;
1303
1304 out_release:
1305     sock_release(sock);
1306     return retval;
1307 }

1272行:使用宏 SYSCALL_DEFINE3定义了内核export出来的API “sys_socket”,参数是int family, int type, 和int protocol。

1279~1282行:对于这些常量作出编译期间的检查。

1284~1286行:在linux2.6.27以前的版本,参数int type只能取真正的socket type的值,即下面的

enum sock_type {
    SOCK_STREAM    = 1,
    SOCK_DGRAM    = 2,
    SOCK_RAW    = 3,
    SOCK_RDM    = 4,
    SOCK_SEQPACKET    = 5,
    SOCK_DCCP    = 6,
    SOCK_PACKET    = 10,
};

但是在Linux 2.6.27版本以后,type有了第二个用途,它可以或上下面的两个数,来指定socket的行为。

#define SOCK_CLOEXEC    O_CLOEXEC
#ifndef SOCK_NONBLOCK
#define SOCK_NONBLOCK    O_NONBLOCK
#endif

所以,1284行到1286行,是为了检测是否type是否只set了上面两个位。如果不是的话,即为非法的type,返回错误EINVAL。

1287行:获得真正的type值

1289~1290行:如果socket的NOBLOCK标志位不等于普通的文件描述符标志的NOBLOCK标志,且该socket设置了SOCK_NONBLOCK,那么就取消这个SOCK_NONBLOCK标志位,并设置上O_NONBLOCK标志位。

sock_create之后,我们获得了一个socket,然后调用sock_map_fd,将其映射为文件描述符,并将这个描述符返回给用户。
今天又晚了。。。正在看 sock_create的代码,明天继续吧。

目录
相关文章
|
2月前
|
缓存 测试技术 API
API的封装步骤流程
API封装流程是一个系统化的过程,旨在将内部功能转化为可复用的接口供外部调用。流程包括明确需求、设计接口、选择技术和工具、编写代码、测试、文档编写及部署维护。具体步骤为确定业务功能、数据来源;设计URL、请求方式、参数及响应格式;选择开发语言、框架和数据库技术;实现数据连接、业务逻辑、错误处理;进行功能、性能测试;编写详细文档;部署并持续维护。通过这些步骤,确保API稳定可靠,提高性能。
|
8天前
|
存储 数据可视化 API
API接口数据获取流程的细化
本文概述了API的基础知识、获取API访问权限的方法、编写代码调用API的步骤、数据处理与分析技巧以及数据安全与合规的重要性,并提供了社交媒体数据分析、天气预报应用和电商数据分析等API数据获取的应用实例,旨在帮助读者全面了解和实践API接口数据获取的流程。
|
4天前
|
存储 监控 安全
API接口数据获取全流程用户指南
本文介绍了从明确需求到数据存储与管理的API接口数据获取全流程。首先,明确业务需求和选择合适的数据源;接着,准备API接口,包括审查文档、申请密钥和安全存储;然后,构建与发送请求,处理响应与数据;最后,进行数据存储与管理,并持续监控与优化,确保数据的安全与合规。通过这些步骤,用户可以高效地获取和管理数据,为数据分析和业务优化提供支持。
|
28天前
|
存储 网络协议 Java
【网络】UDP回显服务器和客户端的构造,以及连接流程
【网络】UDP回显服务器和客户端的构造,以及连接流程
49 2
|
1月前
|
网络协议 Linux 网络性能优化
Linux基础-socket详解、TCP/UDP
综上所述,Linux下的Socket编程是网络通信的重要组成部分,通过灵活运用TCP和UDP协议,开发者能够构建出满足不同需求的网络应用程序。掌握这些基础知识,是进行更复杂网络编程任务的基石。
77 1
|
28天前
|
JSON JavaScript API
商品详情数据接口解析返回的JSON数据(API接口整套流程)
商品详情数据接口解析返回的JSON数据是API接口使用中的一个重要环节,它涉及从发送请求到接收并处理响应的整个流程。以下是一个完整的API接口使用流程,包括如何解析返回的JSON数据:
|
2月前
|
C语言
C语言 网络编程(七)UDP通信创建流程
本文档详细介绍了使用 UDP 协议进行通信的过程,包括创建套接字、发送与接收消息等关键步骤。首先,通过 `socket()` 函数创建套接字,并设置相应的参数。接着,使用 `sendto()` 函数向指定地址发送数据。为了绑定地址,需要调用 `bind()` 函数。接收端则通过 `recvfrom()` 函数接收数据并获取发送方的地址信息。文档还提供了完整的代码示例,展示了如何实现 UDP 的发送端和服务端功能。
|
2月前
|
网络协议 Linux
TCP 和 UDP 的 Socket 调用
【9月更文挑战第6天】
|
3月前
|
监控 测试技术 API
|
3天前
|
供应链 数据挖掘 API
电商API接口介绍——sku接口概述
商品SKU(Stock Keeping Unit)接口是电商API接口中的一种,专门用于获取商品的SKU信息。SKU是库存量单位,用于区分同一商品的不同规格、颜色、尺寸等属性。通过商品SKU接口,开发者可以获取商品的SKU列表、SKU属性、库存数量等详细信息。