9.TCP Client端的实现
摘要:本文介绍了一个基于C/S模型的TCP客户端实现,使用LWIP协议栈和FreeRTOS实时操作系统。客户端程序(tcp_client.c)包含socket创建、服务器连接和数据处理功能,接收到数据后会进行大小写转换并返回。程序通过vTcpClient_Task()任务实现持续通信,并在连接成功后打印"server is connect ok"。FreeRTOS的Start_
·
1.C/S模型
2.Client 端功能分析

tcp_client.c
#include "tcp_client.h"
#include "tcp_server.h"
#include "lwip/sockets.h"
#include <stdio.h>
static char ReadBuff[BUFF_SIZE];
void vTcpClient_Task(void)
{
int cfd, n, i;
struct sockaddr_in server_addr;
//创建socket
cfd = socket(AF_INET, SOCK_STREAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
//连接服务器
connect(cfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
printf("server is connect ok\r\n");
while(1){
//等待服务器发送数据
n = read(cfd, ReadBuff, BUFF_SIZE);
//进行大小写转换
for(i = 0; i < n; i++){
ReadBuff[i] = toupper(ReadBuff[i]);
}
//写回服务器
write(cfd, ReadBuff, n);
}
}
tcp_client.h
#ifndef _TCP_CLIENT_H_
#define _TCP_CLIENT_H_
#include "main.h"
void vTcpClient_Task(void);
#endif
freertos.c
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "tcp_server.h"
#include "tcp_client.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
/* USER CODE END Variables */
/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
.name = "defaultTask",
.stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* Definitions for Start_Task */
osThreadId_t Start_TaskHandle;
const osThreadAttr_t Start_Task_attributes = {
.name = "Start_Task",
.stack_size = 1024 * 4,
.priority = (osPriority_t) osPriorityBelowNormal,
};
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */
/* USER CODE END FunctionPrototypes */
void StartDefaultTask(void *argument);
void StartTask(void *argument);
extern void MX_LWIP_Init(void);
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
/**
* @brief FreeRTOS initialization
* @param None
* @retval None
*/
void MX_FREERTOS_Init(void) {
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* USER CODE BEGIN RTOS_MUTEX */
/* add mutexes, ... */
/* USER CODE END RTOS_MUTEX */
/* USER CODE BEGIN RTOS_SEMAPHORES */
/* add semaphores, ... */
/* USER CODE END RTOS_SEMAPHORES */
/* USER CODE BEGIN RTOS_TIMERS */
/* start timers, add new ones, ... */
/* USER CODE END RTOS_TIMERS */
/* USER CODE BEGIN RTOS_QUEUES */
/* add queues, ... */
/* USER CODE END RTOS_QUEUES */
/* Create the thread(s) */
/* creation of defaultTask */
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
/* creation of Start_Task */
Start_TaskHandle = osThreadNew(StartTask, NULL, &Start_Task_attributes);
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
/* USER CODE END RTOS_THREADS */
/* USER CODE BEGIN RTOS_EVENTS */
/* add events, ... */
/* USER CODE END RTOS_EVENTS */
}
/* USER CODE BEGIN Header_StartDefaultTask */
/**
* @brief Function implementing the defaultTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
/* init code for LWIP */
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
osDelay(1);
}
/* USER CODE END StartDefaultTask */
}
/* USER CODE BEGIN Header_StartTask */
/**
* @brief Function implementing the Start_Task thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask */
void StartTask(void *argument)
{
/* USER CODE BEGIN StartTask */
MX_LWIP_Init();
printf("Start LWIP!\r\n");
/* Infinite loop */
for(;;)
{
vTcpClient_Task();
osDelay(1);
}
/* USER CODE END StartTask */
}
串口调试打印,客户端连接服务器成功

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐



所有评论(0)