STM32CUBEMX创建RTOS+LWIP工程ping通之后基于socket的TCP服务器的搭建学习记录

时间:2024-03-26 07:01:59

注 :未经允许请勿转载,请尊重劳动成果,大家都是知识分子!谢谢各位大佬赏脸!

实验器材:

硬件:原子的STM32F429阿波罗开发板

软件:STM32CUBEMX,MDK5,网络调试助手

在上一篇讲到了如何创建一个基于freeRTOS操作系统的LWIP的工程,详情请见上一篇博客!

今天主要是记录一下,如何用socket搭建TCP服务器

在STM32CUBEMX上配置硬件电路的就略过。

下面是程序部分:

#include <lwip/sockets.h>
#include <lwip/err.h>
#include <lwip/sys.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "gpio.h"
#include "usart.h"
#define    SERVER_PORT            40080

uint8_t counter[100];
char socket_server_recbuff[300];        
char socket_server_sendbuff[300];

static void socket_server_thread(void *p_arg)
{
    struct sockaddr_in server_addr;
    struct sockaddr_in connect_addr;
    int socket;                /* 定义 套接字*/
    int socket_connect;            /* 请求套接字 */
    socklen_t addr_len;
    int err;
    int length;
    int count;
    
    
    socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr =htonl(INADDR_ANY);
    server_addr.sin_port = htons(SERVER_PORT);
    
    err = bind(socket, (struct sockaddr *)&server_addr, sizeof(server_addr));
    if (err < 0) 
    {
            closesocket(socket); //关闭套接字
    }

    err = listen(socket, 1);
    if (err < 0) 
    {
            closesocket(socket); //close the socket
    }
    addr_len = sizeof(struct sockaddr_in);
    
        socket_connect = accept(socket, (struct sockaddr *)&connect_addr, &addr_len);
    
        if(socket_connect<0)
        {
            closesocket(socket);
        }
        else send(socket_connect, "success to connect!\n\r", 20, 0);
    
    while (1) 
    {
        memset(counter, 0, sizeof(counter));
        
        length = recv(socket_connect, (unsigned int *)counter, 100, 0);
        
        for(count=0;count<100;count++)
        {
            //socket_server_recbuff[count]=counter[count];
            send(length, "success to accpet the data!\n\r", 20, 0);
            send(socket_connect,(uint8_t *)&counter,sizeof(counter), 1);
        }    
    }
}

void socket_server_init(void)
{
    sys_thread_new("socket_server_thread",  socket_server_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO - 1);
}

这个程序的实现了最基本的功能是,客户端发送什么消息,服务器端就回复什么消息,接下来打开网络调试助手,设置相应的IP地址和端口(端口的地址小于65536就OK,建议大于2000,其他随意设,只要没被占用)。在设置完之后点击连接,就OK了。

STM32CUBEMX创建RTOS+LWIP工程ping通之后基于socket的TCP服务器的搭建学习记录

我从客户端发送123,服务器就会给我回复123,这样就搞定啦。

                                                                                                                                       (文章出自:build_oooxf)