源文件
#include "lwip_tcp_driver.h"
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include <cstring>
static const char send_data[8] = {0xff,0x44,0x55,0x66,0xdd};
namespace lwip_tcp {
struct client_info *client_fo;
struct client_task_info *client_task_fo;
struct link_socket_info *socket_link_info;
void send_task(void *param) {
struct client_info* client = (struct client_info *)param;
const char *data_to_send = "Hello, Client!";
int data_length = strlen(data_to_send);
while (1) {
int sent_bytes = send(client->socket_num, data_to_send, data_length, 0);
if (sent_bytes < 0) {
debug_print("Failed to send data to client[%d]\r\n", client->socket_num);
break;
}
debug_print("Sent %d bytes to client[%d]\r\n", sent_bytes, client->socket_num);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
mem_free(client);
closesocket(client->socket_num);
vTaskDelete(NULL);
}
void tcp_server_thread(void *param){
struct client_info* client = (struct client_info *)param;
debug_print("Client[%d]%s:%d is connect server\r\n", client->socket_num, inet_ntoa(client->ip_addr.sin_addr),ntohs(client->ip_addr.sin_port));
send(client->socket_num, (const void* )send_data, strlen(send_data), 0);
TaskHandle_t send_task_handle;
xTaskCreate(send_task, "SendTask", 1024, (void *)client, osPriorityNormal, &send_task_handle);
if (send_task_handle == NULL) {
debug_print("Failed to create send task for client[%d]\r\n", client->socket_num);
}
while (1){
char str[1024];
memset(str, 0, sizeof(str));
int bytes = recv(client->socket_num, str, sizeof(str), 0);
if (bytes <= 0){
mem_free(client);
closesocket(client->socket_num);
break;
}
debug_print("[%d] %s:%d recv size:%d\r\n", client->socket_num, inet_ntoa(client->ip_addr.sin_addr),ntohs(client->ip_addr.sin_port), bytes);
send((int )client->socket_num, (const void * )str, bytes, 0);
}
debug_print("[%d]%s:%d is disconnect...\r\n", client->socket_num, inet_ntoa(client->ip_addr.sin_addr),ntohs(client->ip_addr.sin_port));
vTaskDelete(NULL);
}
void tcp_server_init(void){
int sin_size = sizeof(struct sockaddr_in);
char client_name[10] = "server";
char client_num[10];
socket_link_info = (struct link_socket_info *)mem_malloc(sizeof(struct link_socket_info));
client_task_fo = (struct client_task_info *)mem_malloc(sizeof(struct client_task_info));
client_task_fo->client_handler = NULL;
client_task_fo->client_task_pro = osPriorityNormal;
client_task_fo->client_task_stk = 1024;
if((socket_link_info->sock_listen = socket(AF_INET, SOCK_STREAM, 0)) == -1){
debug_print("Socket error\r\n");
return;
}
socket_link_info->listen_addr.sin_family = AF_INET;
socket_link_info->listen_addr.sin_port = htons(5000);
socket_link_info->listen_addr.sin_addr.s_addr = htonl(INADDR_ANY);
memset(&(socket_link_info->listen_addr.sin_zero), 0, sizeof(socket_link_info->listen_addr.sin_zero));
if (bind(socket_link_info->sock_listen, (struct sockaddr * )&socket_link_info->listen_addr, sizeof(struct sockaddr)) < 0){
debug_print("Bind fail!\r\n");
goto __exit;
}
listen(socket_link_info->sock_listen, 4);
debug_print("begin listing...\r\n");
while (1){
socket_link_info->sock_connect = accept(socket_link_info->sock_listen, (struct sockaddr* )&socket_link_info->connect_addr, (socklen_t* )&sin_size);
if (socket_link_info->sock_connect == -1){
debug_print("no socket,waitting others socket disconnect.\r\n");
continue;
}
lwip_itoa((char *)socket_link_info->sock_connect, (size_t)client_num, 10);
strcat(client_name, client_num);
client_task_fo->client_name = client_name;
client_task_fo->client_num = client_num;
client_fo = (struct client_info *)mem_malloc(sizeof(struct client_info));
client_fo->socket_num = socket_link_info->sock_connect;
memcpy(&client_fo->ip_addr, &socket_link_info->connect_addr, sizeof(struct sockaddr_in));
client_fo->sockaddr_len = sin_size;
xTaskCreate((TaskFunction_t )tcp_server_thread,
(const char * )client_task_fo->client_name,
(uint16_t )client_task_fo->client_task_stk,
(void * )(void*) client_fo,
(UBaseType_t )client_task_fo->client_task_pro ++ ,
(TaskHandle_t * )&client_task_fo->client_handler);
if (client_task_fo->client_handler == NULL){
debug_print("no memery for thread %s startup failed!\r\n",client_task_fo->client_name);
mem_free(client_fo);
continue;
}else{
debug_print("thread %s success!\r\n", client_task_fo->client_name);
}
}
__exit:
debug_print("listener failed\r\n");
closesocket(socket_link_info->sock_listen);
vTaskDelete(NULL);
}
}
头文件
#ifndef LWIP_TCP_DRIVER_H
#define LWIP_TCP_DRIVER_H
#include "stm32f4xx_hal.h"
#include "lwip/opt.h"
#include "lwip/sockets.h"
#include "lwip/sys.h"
#include "lwip/api.h"
namespace lwip_tcp{
struct client_info
{
int socket_num;
struct sockaddr_in ip_addr;
int sockaddr_len;
};
struct client_task_info
{
UBaseType_t client_task_pro;
uint16_t client_task_stk;
TaskHandle_t * client_handler;
char *client_name;
char *client_num;
};
struct link_socket_info
{
int sock_listen;
int sock_connect;
struct sockaddr_in listen_addr;
struct sockaddr_in connect_addr;
};
void tcp_server_init(void);
void tcp_client_init(void);
}
#endif