c++ tcpserver esp32
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | static void app_tcp_server_multi_conn_task( void *arg) { struct sockaddr_in serv_addr; fd_set all_set, read_set; /*!< 定义文件句柄集合 */ int sockfd_max = 0; /*!< 文件句柄最大值 */ int serv_sockfd = socket(AF_INET, SOCK_STREAM, 0); if (serv_sockfd < 0) { ESP_LOGE(TAG, "Unable to create socket: errno %d" , errno ); vTaskDelete(NULL); } ESP_LOGI(TAG, "Socket created, serv_sockfd=%d" , serv_sockfd); bzero(&serv_addr, sizeof ( struct sockaddr_in)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(TCP_SERVER_PORT); if (bind(serv_sockfd, ( struct sockaddr *)&serv_addr, sizeof (serv_addr)) < 0) { ESP_LOGE(TAG, "Socket unable to bind: errno %d" , errno ); vTaskDelete(NULL); } ESP_LOGI(TAG, "Socket binded" ); if (listen(serv_sockfd, TCP_SERVER_LISTEN_CLIENT_NUM) < 0) { ESP_LOGE(TAG, "Error occured during listen: errno %d" , errno ); vTaskDelete(NULL); } ESP_LOGI(TAG, "Socket listening" ); FD_ZERO(&all_set); /*!< 清空集合 */ FD_SET(serv_sockfd, &all_set); /*!< 添加serv_sockfd */ sockfd_max = serv_sockfd; while (1) { read_set = all_set; if (select(sockfd_max + 1, &read_set, NULL, NULL, NULL) == -1) /*!< 监听句柄集的可读性 */ { ESP_LOGE(TAG, "Sever select error" ); } for ( int sockfd = 0; sockfd <= sockfd_max; sockfd++) /*!< 从零开始判断 */ { if (!FD_ISSET(sockfd, &read_set)) /*!< sockfd在集合中状态是否变化 */ { continue ; /*!< 跳出当前循环 */ } if (sockfd == serv_sockfd) /*!< 新的客户端连接 */ { struct sockaddr_in cli_addr; socklen_t cli_addr_len; int cli_sockfd; cli_addr_len = sizeof (cli_addr); memset (&cli_addr, 0, cli_addr_len); cli_sockfd = accept(serv_sockfd, ( struct sockaddr *)&cli_addr, &cli_addr_len); if (cli_sockfd < 0) { ESP_LOGE(TAG, "Unable to accept connection: errno %d" , errno ); } else { FD_SET(cli_sockfd, &all_set); if (cli_sockfd > sockfd_max) { sockfd_max = cli_sockfd; } ESP_LOGI(TAG, "sockfd_max=%d" , sockfd_max); ESP_LOGI(TAG, "A new client[cli_sockfd=%d] is connected from %s" , cli_sockfd, inet_ntoa(cli_addr.sin_addr)); } } else /*!< 客户端的通信数据 */ { char rx_buffer[128] = {0}; int len = recv(sockfd, rx_buffer, sizeof (rx_buffer) - 1, 0); if (len < 0) { ESP_LOGE(TAG, "Recv failed: errno %d" , errno ); FD_CLR(sockfd, &all_set); /*!< 从集合中删除 */ close(sockfd); ESP_LOGI(TAG, "sockfd_max=%d" , sockfd_max); break ; } else if (len == 0) { ESP_LOGI(TAG, "Connection closed" ); FD_CLR(sockfd, &all_set); /*!< 从集合中删除 */ close(sockfd); ESP_LOGI(TAG, "sockfd_max=%d" , sockfd_max); break ; } else { ESP_LOGI(TAG, "Received %d bytes from socket_fd[%d]:" , len, sockfd); ESP_LOGI(TAG, "%s" , rx_buffer); flow_control_msg_t msg = { .packet = rx_buffer, .length = len}; if (xQueueSend(flow_control_queue, &msg, pdMS_TO_TICKS(FLOW_CONTROL_QUEUE_TIMEOUT_MS)) != pdTRUE) { ESP_LOGE(TAG, "send flow control message failed or timeout" ); //free rx_buffer? } } } } } vTaskDelete(NULL); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2021-09-09 类的抽象能力
2021-09-09 程序员辞职的一万个理由
2020-09-09 vlc libavi
2020-09-09 关键字
2020-09-09 img_yuv422_to_rgb32
2020-09-09 itop4412
2019-09-09 WTSEnumerateSessions 枚举session信息