PicoW_UDP/src/udp/udp_server.c

88 lines
1.9 KiB
C

#include "udp_server.h"
#include <stdio.h>
#include "pico/cyw43_arch.h"
#include "lwip/def.h"
udp_server_t udp_server;
void udp_server_init(int port)
{
udp_server.pcb = udp_new();
if(!udp_server.pcb)
{
puts("Error creating UDP server");
return;
}
err_t err = udp_bind(udp_server.pcb, IP_ADDR_ANY, port);
if(err != ERR_OK)
{
printf("Error binding UDP server: %d\n", err);
return;
}
}
void udp_server_exit(void)
{
if(udp_server.pcb)
{
udp_remove(udp_server.pcb);
udp_server.pcb = NULL;
}
}
void udp_server_send(const uint8_t *data, size_t length, const char *ip, uint16_t port)
{
ip4addr_aton(ip, &udp_server.remote_addr);
udp_server.remote_port = port;
// Nombre maximum de tentatives
const int MAX_RETRIES = 3;
uint tries = 0;
while(tries < MAX_RETRIES)
{
struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, length, PBUF_RAM);
if(p == NULL)
{
printf("Try %d - Error allocating pbuf\n", ++tries);
sleep_ms(100); // Wait before retry
continue;
}
memcpy(p->payload, (char *)data, length);
err_t err = udp_sendto(udp_server.pcb, p, &udp_server.remote_addr, udp_server.remote_port);
pbuf_free(p);
if (err == ERR_OK)
{
return; // Succès
}
else
{
const char* error_msg;
switch(err)
{
case ERR_MEM:
error_msg = "Insuficient memory";
break;
case ERR_BUF:
error_msg = "Buffer full";
break;
default:
error_msg = "Unknown error";
}
printf("Try %d - Error send UDP: %d (%s)\n", ++tries, err, error_msg);
sleep_ms(100); // Wait before retry
}
}
printf("Error sending data after %d tries...\n", tries);
}