recv()/send() 用新套接字与客户端进行通信。
closesocket() 关闭 socket,回收资源。
2.1 SAL 简介
SAL 组件主要功能特点:
抽象、统一多种网络协议栈接口;
提供 Socket 层面的 TLS 加密传输特性;
支持标准 BSD Socket API;
统一的 FD 管理,便于使用 read/write poll/select 来操作网络功能;
SAL 网络框架:
2.2 SAL 原理
多协议栈接入与接口函数统一抽象功能:
对于不同的协议栈或网络功能实现,网络接口的名称可能各不相同,以 connect 连接函数为例,lwIP 协议栈中接口名称为 lwip_connect ,而 AT Socket 网络实现中接口名称为 at_connect。SAL 组件提供对不同协议栈或网络实现接口的抽象和统一,组件在 socket 创建时通过判断传入的协议簇(domain)类型来判断使用的协议栈或网络功能,完成 RT-Thread 系统中多协议的接入与使用。
目前 SAL 组件支持的协议栈或网络实现类型有:lwIP 协议栈、AT Socket 协议栈、WIZnet 硬件 TCP/IP 协议栈。
在 Socket 中,它使用一个套接字来记录网络的一个连接,套接字是一个整数,就像我们操作文件一样,利用一个文件描述符,可以对它打开、读、写、关闭等操作,类似的,在网络中,我们也可以对 Socket 套接字进行这样子的操作,比如开启一个网络的连接、读取连接主机发送来的数据、向连接的主机发送数据、终止连接等操作。
socket文件描述符的操作接口如下所示,在创建套接字的时候进行初始化,当使用虚拟文件系统的接口write(),read(),close()等接口时,会调用如下相应接口:
1const struct dfs_file_ops _net_fops =
2{
3 NULL, /* open */
4 dfs_net_close,
5 dfs_net_ioctl,
6 dfs_net_read,
7 dfs_net_write,
8 NULL,
9 NULL, /* lseek */
10 NULL, /* getdents */
11 dfs_net_poll,
12};
创建套接字接口:
1int socket(int domain, int type, int protocol);
socket调用的流程大致如下:socket-》sal_socket-》at_socket/lwip_socket.
创建一个BSD套接字
分配一个fd文件描述符
初始化fd文件描述符
创建套接字,然后将其放入dfs_fd
上述为标准 BSD Socket API 中 socket 创建函数的定义,domain 表示协议域又称为协议簇(family),用于判断使用哪种协议栈或网络实现,AT Socket 协议栈使用的簇类型为 AF_AT,lwIP 协议栈使用协议簇类型有 AF_INET等,WIZnet 协议栈使用的协议簇类型为 AF_WIZ。
对于不同的软件包,socket 传入的协议簇类型可能是固定的,不会随着 SAL 组件接入方式的不同而改变。为了动态适配不同协议栈或网络实现的接入,SAL 组件中对于每个协议栈或者网络实现提供两种协议簇类型匹配方式:主协议簇类型和次协议簇类型。socket 创建时先判断传入协议簇类型是否存在已经支持的主协议类型,如果是则使用对应协议栈或网络实现,如果不是判断次协议簇类型是否支持。目前系统支持协议簇类型如下: