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 创建时先判断传入协议簇类型是否存在已经支持的主协议类型,如果是则使用对应协议栈或网络实现,如果不是判断次协议簇类型是否支持。目前系统支持协议簇类型如下:

  • UC3846控制芯片工作原理控制图 逆变焊机原理与用途
  • 数字万用表电阻档测试二极管正反向没有阻值(使用万用表测量二极管的正向电阻,为什么各档)
  • 学单片机需要学数电模电吗(学单片机要先学数电模电吗)
  • 电工怎么选择适合自己用的万用表(电工初学者买什么样的万用表好)
  • 单片机需要同时运行多个任务怎么办(单片机怎么同时执行多个任务)
  • 电机保护的方案取决于负载的机械特性
  • 绝缘电阻表正负搭接不复零位是怎么回事
  • 短路怎么用万用表查