|
|
@ -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) { |
|
|
|