Lwip之TCP服务端示例记录(1对1)

示例

//
// Created by shchl on 2024/3/8.
//
#if  1

#include <string.h>
#include "lwip/api.h"
#include "FreeRTOS.h"
#include "task.h"
#include "usart.h"
#include "lwip_comm.h"

static TaskHandle_t tcp_server; /*任务句柄*/
static void tcp_server_entity(void *args);

void netconn_tcp_server_create_thread() {

    xTaskCreate(
            (TaskFunction_t) tcp_server_entity,
            "tcp_server",
            256,
            NULL,
            10,
            &tcp_server
    );


}

#define TCP_SERVER_RX_BUFSIZE 1500
static struct netconn *conn;
static struct netconn *client_conn;/*客户端连接*/
static uint8_t remot_addr[4] = {0}; /*远端ip数组*/
static u16_t port;/*远端端口*/
static ip_addr_t ipaddr;/*远端ip*/
static u8_t tcp_server_recvbuf[TCP_SERVER_RX_BUFSIZE] = {0};

static void tcp_server_entity(void *args) {
    err_t err;
    conn = netconn_new(NETCONN_TCP);  //创建一个TCP链接
    netconn_bind(conn, IP_ADDR_ANY, 8080);  //绑定端口 8号端口
    netconn_listen(conn);        //进入监听模式
    conn->recv_timeout = 10;    //禁止阻塞线程 等待10ms
    struct netbuf *recvbuf;
    u32_t data_len = 0;
    while (1) {
        handle_listen_tag:
        err = netconn_accept(conn, &client_conn);  //接收连接请求
        if (err == ERR_OK) {

            client_conn->recv_timeout = 10;

            netconn_getaddr(client_conn, &ipaddr, &port, 0); //获取远端IP地址和端口号


            remot_addr[3] = (uint8_t) (ipaddr.addr >> 24);
            remot_addr[2] = (uint8_t) (ipaddr.addr >> 16);
            remot_addr[1] = (uint8_t) (ipaddr.addr >> 8);
            remot_addr[0] = (uint8_t) (ipaddr.addr);
            printf("主机%d.%d.%d.%d连接上服务器,主机端口号为:%d\r\n",
                   remot_addr[0], remot_addr[1], remot_addr[2], remot_addr[3], port);

            handle_client_tag:/*处理客户端请求*/
            err = netconn_recv(client_conn, &recvbuf);
            switch (err) {
                case ERR_OK: {
                    portDISABLE_INTERRUPTS();

                    memset(tcp_server_recvbuf, 0, TCP_SERVER_RX_BUFSIZE);  //数据接收缓冲区清零
                    for (struct pbuf *q = recvbuf->p; q != NULL; q = q->next)  //遍历完整个pbuf链表
                    {
                        if (q->len > (TCP_SERVER_RX_BUFSIZE - data_len)) {
                            /*数据超出缓冲区大小*/
                            memcpy(tcp_server_recvbuf + data_len, q->payload, TCP_SERVER_RX_BUFSIZE - data_len);
                            break;
                        } else {
                            memcpy(tcp_server_recvbuf + data_len, q->payload, q->len);
                        }
                        data_len += q->len;
                        if (data_len > TCP_SERVER_RX_BUFSIZE) break;
                    }
                    portENABLE_INTERRUPTS();
                    // todo 应用逻辑处理
                    USART1_Transmits(tcp_server_recvbuf, data_len);
                    data_len = 0;  //复制完成后data_len要清零。
                    netbuf_delete(recvbuf);
                    break;
                }
                case ERR_CLSD:
                case ERR_RST: {
                    printf("主机:%d.%d.%d.%d断开与服务器的连接\r\n", remot_addr[0], remot_addr[1], remot_addr[2],
                           remot_addr[3]);
                    goto release_conn_tag;
                }
                default:
                    if (g_lwipdev.link_status == LWIP_LINK_OFF) { /*判断网线是否连接正常*/
                        printf("物理连线出现问题\r\n");
                        goto release_conn_tag;
                    }
                 break;
            }
               goto handle_client_tag;
            release_conn_tag: /*释放链接*/
            {
                netconn_close(client_conn);
                netconn_delete(client_conn);
                goto handle_listen_tag;
            }

        }
        vTaskDelay(1000);
    }
}

#endif

相关推荐

  1. LwipTCP服务示例记录(11)

    2024-03-13 00:56:03       20 阅读
  2. LwipTCP客户示例记录

    2024-03-13 00:56:03       21 阅读
  3. rt-threadsal+lwiptcp客户示例记录

    2024-03-13 00:56:03       23 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-13 00:56:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-13 00:56:03       18 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-13 00:56:03       17 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-13 00:56:03       20 阅读

热门阅读

  1. swagger-ui页面设置接口请求头head参数

    2024-03-13 00:56:03       19 阅读
  2. .NET Core 日志记录功能详解

    2024-03-13 00:56:03       17 阅读
  3. LeetCode每日一题[C++]-2129.将标题首字母大写

    2024-03-13 00:56:03       21 阅读
  4. 【LeetCode】 删除链表的倒数第 N 个结点

    2024-03-13 00:56:03       21 阅读
  5. css---定位

    2024-03-13 00:56:03       21 阅读
  6. 高防IP有哪些防御方法?

    2024-03-13 00:56:03       23 阅读
  7. C++ struct 结构体类型

    2024-03-13 00:56:03       17 阅读
  8. 数据结构-单链表

    2024-03-13 00:56:03       19 阅读
  9. 状态模式在交易策略开发中的应用

    2024-03-13 00:56:03       23 阅读
  10. openssl3.2 - exp - generate prime

    2024-03-13 00:56:03       20 阅读