static void mg_handle_udp_read(struct mg_connection *nc) { char *buf = NULL; union socket_address sa; socklen_t sa_len = sizeof(sa); int n = mg_recvfrom(nc, &sa, &sa_len, &buf); DBG(("%p %d bytes from %s:%d", nc, n, inet_ntoa(nc->sa.sin.sin_addr), ntohs(nc->sa.sin.sin_port))); mg_if_recv_udp_cb(nc, buf, n, &sa, sa_len); }
static void mg_lwip_udp_recv_cb(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port) { struct mg_connection *nc = (struct mg_connection *) arg; size_t len = p->len; char *data = (char *) malloc(len); union socket_address sa; DBG(("%p %s:%u %u", nc, ipaddr_ntoa(addr), port, p->len)); if (data == NULL) { DBG(("OOM")); pbuf_free(p); return; } sa.sin.sin_addr.s_addr = addr->addr; sa.sin.sin_port = htons(port); pbuf_copy_partial(p, data, len, 0); pbuf_free(p); mg_if_recv_udp_cb(nc, data, len, &sa, sizeof(sa.sin)); }