内核中的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的代码,明天继续吧。

相关文章
|
3天前
|
存储 Python
Python网络编程基础(Socket编程) UDP 发送和接收数据
【4月更文挑战第10天】对于UDP客户端而言,发送数据是一个相对简单的过程。首先,你需要构建一个要发送的数据报,这通常是一个字节串(bytes)。然后,你可以调用socket对象的`sendto`方法,将数据报发送到指定的服务器地址和端口。
|
3天前
|
存储 Python
Python网络编程基础(Socket编程)UDP客户端编程
【4月更文挑战第9天】在UDP通信中,客户端负责发送数据到服务器,并接收来自服务器的响应。与服务器不同,客户端通常不需要绑定到特定的地址和端口,因为它可以临时使用任何可用的端口来发送数据。下面,我们将详细讲解UDP客户端编程的基本步骤。
|
3天前
|
网络协议 Python
Python网络编程基础(Socket编程)创建UDP socket对象
【4月更文挑战第8天】在Python中创建UDP服务器涉及使用`socket`模块创建socket对象,如`udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)`,然后绑定到特定IP地址和端口,如`udp_socket.bind(('localhost', 12345))`。服务器通过`recvfrom`在无限循环中监听和接收数据报。这只是基础,实际应用还需处理接收、解析、响应及错误处理等。接下来可学习如何利用socket对象进行数据交互以构建完整服务器。
|
3天前
|
网络协议 网络性能优化 开发者
Python网络编程基础(Socket编程)UDP Socket编程
【4月更文挑战第8天】Python网络编程中,UDP与TCP协议各有特点。TCP提供可靠连接,确保数据顺序与完整性,适合文件传输等;UDP则无连接,速度快,常用于实时音视频,牺牲了数据可靠性。Python的socket库支持两者,开发者可根据需求选择。
|
3天前
|
算法 Linux 调度
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
22 1
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
|
3天前
|
监控 安全 Linux
socket编程之常用api介绍与socket、select、poll、epoll高并发服务器模型代码实现(3)
高并发服务器模型-poll poll介绍   poll跟select类似, 监控多路IO, 但poll不能跨平台。其实poll就是把select三个文件描述符集合变成一个集合了。
38 0
|
3天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
3天前
|
Python
Python网络编程基础(Socket编程)UDP服务器编程
【4月更文挑战第8天】Python UDP服务器编程使用socket库创建UDP套接字,绑定到特定地址(如localhost:8000),通过`recvfrom`接收客户端数据报,显示数据长度、地址和内容。无连接的UDP协议使得服务器无法主动发送数据,通常需应用层实现请求-响应机制。当完成时,用`close`关闭套接字。
|
3天前
|
网络协议 Linux
TCP 和 UDP 的 Socket 调用
【2月更文挑战第19天】
TCP 和 UDP 的 Socket 调用
|
3天前
|
存储 网络协议 Unix
Linux C socket API 介绍
Socket英文愿意是“插孔”或“插座”,作为BSD UNIX的进程通信机制后,取后一种意思,通常也被称为套接字。使用TCP/IP协议的应用程序通常采用的应用编程是使用UNIX BSD的套接字Socket,来实现网络进程之间的通信。
38 0