From eb4ecc5d11b62c90e6164c663132dcccb8e9ed1f Mon Sep 17 00:00:00 2001 From: zhaohe Date: Wed, 19 Jun 2024 11:51:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dlwip=E6=8E=A5=E6=94=B6?= =?UTF-8?q?=E4=B8=8D=E5=88=B0udp=E5=8C=85=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xs_udp.c | 24 ++++++++++++++++++++++++ xs_udp.h | 5 ++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/xs_udp.c b/xs_udp.c index 9e38393..fb6948b 100644 --- a/xs_udp.c +++ b/xs_udp.c @@ -27,6 +27,21 @@ static void udp_server_receive_thread(void const *argument) { // } } +/** + * @brief + * + * 由于lwip如果不接收消息,消息就会一直缓存,不会被丢弃,所以只要创建了某个socket就需要 + * 监听其消息 + */ +static void udp_broadcast_rx_thread(void const *argument) { // + udp_broadcast_handler_t *udp_handler = (udp_t *)argument; + while (true) { + struct sockaddr_in sock; + socklen_t sock_len = sizeof(sock); + int recv_datalen = recvfrom(udp_handler->sock_fd, (char *)udp_handler->rxbuf, udp_handler->rxbuf_len, 0, (struct sockaddr *)&sock, &sock_len); + } +} + bool xs_udp_init(udp_t *udp_handler, const char *name, uint16_t port, udp_on_packet_t on_packet, int32_t rxbuf_size, void *data) { memset(udp_handler, 0, sizeof(udp_t)); udp_handler->server.sin_family = AF_INET; @@ -82,6 +97,10 @@ bool xs_udp_broadcast_init(udp_broadcast_handler_t *udp_handler, uint16_t localp udp_handler->server.sin_addr.s_addr = inet_addr("0.0.0.0"); udp_handler->server.sin_port = htons(localport); + udp_handler->rxbuf_len = 1024; + udp_handler->rxbuf = (char *)malloc(udp_handler->rxbuf_len); + ZASSERT(udp_handler->rxbuf); + // 创建客户端用于通信的Socket udp_handler->sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (udp_handler->sock_fd < 0) { @@ -93,6 +112,11 @@ bool xs_udp_broadcast_init(udp_broadcast_handler_t *udp_handler, uint16_t localp SOCKET_DO(lwip_setsockopt(udp_handler->sock_fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv))); // 绑定 SOCKET_DO(bind(udp_handler->sock_fd, (struct sockaddr *)&udp_handler->server, sizeof(udp_handler->server))); + + osThreadDef(_udp_broadcast_rx_thread, udp_broadcast_rx_thread, osPriorityNormal, 0, 512); + udp_handler->rx_thread = osThreadCreate(osThread(_udp_broadcast_rx_thread), udp_handler); + ZASSERT(udp_handler->rx_thread != NULL); + return true; } ssize_t xs_udp_broadcast(udp_broadcast_handler_t *handler, uint32_t remoteport, uint8_t *data, size_t datalen) { diff --git a/xs_udp.h b/xs_udp.h index 93f7e69..fbcd71b 100644 --- a/xs_udp.h +++ b/xs_udp.h @@ -26,13 +26,16 @@ struct udp_s { typedef struct { struct sockaddr_in server; int sock_fd; + osThreadId rx_thread; + char *rxbuf; + int rxbuf_len; } udp_broadcast_handler_t; bool xs_udp_init(udp_t *udp_handler, const char *name, uint16_t port, udp_on_packet_t on_packet, int32_t rxbuf_size, void *data); int xs_udp_send_message(udp_t *udp_handler, const char *remoteip, int remoteport, const char *data, int len); int xs_udp_send_message2(udp_t *udp_handler, struct sockaddr_in *add, const char *data, int len); -bool xs_udp_broadcast_init(udp_broadcast_handler_t *handler, uint16_t localport); +bool xs_udp_broadcast_init(udp_broadcast_handler_t *handler, uint16_t localport); ssize_t xs_udp_broadcast(udp_broadcast_handler_t *handler, uint32_t remoteport, uint8_t *data, size_t datalen); #ifdef __cplusplus