Browse Source

修复lwip接收不到udp包的BUG

master
zhaohe 1 year ago
parent
commit
eb4ecc5d11
  1. 24
      xs_udp.c
  2. 5
      xs_udp.h

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

5
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

Loading…
Cancel
Save