Skip to content

TCP连接与心跳包配置

本文档介绍了TCP连接与配置心跳包的相关接口,并通过demo_heartbeat.c进行举例演示。接口详细参数请参考LwIP(轻型 TCP/IP 协议栈)

TCP连接服务器收发数据流程

TCP连接服务器收发数据的大致流程如下:

  • 连接服务器

  • 创建套接字

  • 绑定本地地址

  • DNS域名解析

  • 连接服务器

  • 发送数据

  • 接收数据

  • 关闭连接

TCP连接服务器

1.创建套接字

使用 socket 函数创建一个 TCP 套接字,用于后续的网络通信:

int socket_fd;
socket_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);// 创建TCP套接字(AF_INET: IPv4,SOCK_STREAM: TCP协议)

2.绑定本地地址

创建一个本地地址结构体,并使用 bind 函数将套接字与特定的本地地址和端口进行绑定,使套接字有一个明确的标识,以便在网络通信中进行数据的发送和接收:

struct sockaddr_in local4;// 本地地址结构体
memset(&local4, 0x00, sizeof(struct sockaddr_in));//清空结构体
local4.sin_family = AF_INET;// 使用IPv4地址
local4.sin_port = 1000;// 本地端口
bind(socket_fd, (struct sockaddr *)&local4, sizeof(struct sockaddr));// 绑定套接字到本地地址

3.DNS域名解析

gethostbyname 函数获取服务器的地址信息:

struct hostent *hostent;// 用于存储服务器地址信息的结构体
hostent = gethostbyname(TEST_SOCKET_SERVER);// 通过域名或IP获取服务器地址

4.连接服务器

创建服务器地址结构体,并使用 connect 函数连接到服务器:

struct sockaddr_in serv_addr;// 服务器地址结构体
memset(&serv_addr, 0, sizeof(serv_addr));// 清空结构体
serv_addr.sin_family = AF_INET;// 使用IPv4地址
serv_addr.sin_port = htons(TEST_SOCKET_TCP_PORT);// 服务器端口(字节序转换)
serv_addr.sin_addr = *((struct in_addr *)hostent->h_addr);// 从hostent中提取服务器IP地址

connect(socket_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));// 连接到服务器

发送TCP数据

调用send接口向服务器发送数据:

send(socket_fd, data, data_len, 0);//向服务器发送数据

关闭TCP连接

当需要关闭连接时,使用 close 函数关闭套接字:

ret = close(socket_fd);//关闭套接字

心跳包配置

心跳包配置的大致流程如下:

设置睡眠模式

  • 通过yopen_set_sleep_depth(yopen_sleep_depth_e sleep_depth)设置睡眠深度:
yopen_set_sleep_depth(YOPEN_SLP_SLP1_STATE);//设置睡眠深度
  • 通过yopen_autosleep_enable(YOPEN_SLEEP_FLAG_E sleep_flag)使能睡眠:
yopen_set_sleep_depth(YOPEN_SLP_SLP1_STATE);//使能睡眠

配置心跳包

在while循环中调用send接口发送心跳包数据,并通过yopen_rtos_task_sleep_ms()接口设置心跳包间隔时间:

while (1)
        {
            memset(data, 0, sizeof(data));
            sprintf(data, TEST_SOCKET_DATA, i);//字符串输出
            data_len = strlen(data);

            ret = send(socket_fd, data, data_len, 0);//发送心跳包数据

            yopen_trace("==========heartbeat send data %s", data);//打印心跳包共多少字节数据

            yopen_rtos_task_sleep_ms(300*1000);//通过任务休眠设置心跳包间隔时间
        }

举例演示

打开 demo_heartbeat.c,经编译运行后烧录至开发板,具体过程参考Yopen 入门篇开发入门

服务器收到心跳包数据后界面如图所示,心跳包内容为tcp_data 0, 心跳间隔为五分钟: