lwIP 协议栈:family = AF_INET、sec_family = AF_INET

AT Socket 协议栈:family = AF_AT、sec_family = AF_INET WIZnet

硬件 TCP/IP 协议栈:family = AF_WIZ、sec_family = AF_INET

链接服务器接口:

1int connect(int s, const struct sockaddr *name, socklen_t namelen)

2

connect调用的流程大致如下:connect-》sal_connect-》at_connect/lwip_connect.

connect:SAL 组件对外提供的抽象的 BSD Socket API,用于统一 fd 管理;

sal_connect:SAL 组件中 connect 实现函数,用于调用底层协议栈注册的 operation 函数。

at_connect/lwip_connect:底层协议栈提供的层 connect 连接函数,在网卡初始化完成时注册到 SAL 组件中,最终调用的操作函数。

2.3 数据结构

网络接口设备协议簇数据结构:

了解协议栈的相关概念

SAL 套接字表数据结构:

了解协议栈的相关概念

1static struct sal_socket_table socket_table;

初始化sal套接字:

1int sal_init(void);

该初始化函数主要是对 SAL 组件进行初始化,动态申请socket_table对象。支持组件重复初始化判断,完成对组件中使用的互斥锁等资源的初始化。

如果AT组件使用了SAL 套接字,则在sal_at_netdev_set_pf_info(netdev)函数对网络接口设备协议族信息(struct sal_proto_family)进行赋值。

如果LWIP组件使用了SAL 套接字,则在sal_lwip_netdev_set_pf_info(struct netdev *netdev)函数对网络接口设备协议族信息(struct sal_proto_family)进行赋值。

2.4 SAL Socket API 介绍

1int sal_socket(int domain, int type, int protocol)

在套接字表中分配一个新的套接字和注册的套接字选项

通过套接字描述符获取sal套接字对象

初始化sal套接字对象

打开有效的网络接口套接字(at_socket/lwip_socket)

1int sal_bind(int socket, const struct sockaddr *name, socklen_t namelen)

通过套接字描述符获取套接字对象

检查输入ipaddr是否是默认的netdev ipaddr,如果不是根据ip地址获取新的网卡设备

通过网络接口设备检查和获取协议族

调用对应驱动的bind接口(at_bind/lwip_bind)

1int sal_connect(int socket, const struct sockaddr *name, socklen_t namelen)

通过套接字描述符获取套接字对象

调用对应驱动的connect接口(at_connect/lwip_connect)

其他接口:

1int sal_accept(int socket, struct sockaddr *addr, socklen_t *addrlen)

2int sal_shutdown(int socket, int how)

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