void *_udp_server(void *args) { uint16_t port = (uint16_t) atoi(args); ipv6_addr_t server_addr = IPV6_ADDR_UNSPECIFIED; msg_init_queue(server_msg_queue, SERVER_MSG_QUEUE_SIZE); if(conn_udp_create(&conn, &server_addr, sizeof(server_addr), AF_INET6, port) < 0) { return NULL; } server_running = true; printf("Success: started UDP server on port %" PRIu8 "\n", port); while (1) { int res; ipv6_addr_t src; size_t src_len = sizeof(ipv6_addr_t); if ((res = conn_udp_recvfrom(&conn, server_buffer, sizeof(server_buffer), &src, &src_len, &port)) < 0) { puts("Error while receiving"); } else if (res == 0) { puts("No data received"); } else { server_buffer[res] = '\0'; printf("Recvd: %s\n", server_buffer); } } return NULL; }
void *_udp_server(void *args) { uint16_t port = (uint16_t) atoi(args); ipv6_addr_t server_addr = IPV6_ADDR_UNSPECIFIED; msg_init_queue(server_msg_queue, SERVER_MSG_QUEUE_SIZE); if(conn_udp_create(&conn, &server_addr, sizeof(server_addr), AF_INET6, port) < 0) { return NULL; } server_running = true; printf("Success: started UDP server on port %" PRIu16 "\n", port); char *arg[4]; char *cmd = "udp_send"; char *port_str = "8888"; arg[0] = cmd; arg[2] = port_str; char src_str[IPV6_ADDR_MAX_STR_LEN]; while (1) { int res; ipv6_addr_t src; size_t src_len = sizeof(ipv6_addr_t); if ((res = conn_udp_recvfrom(&conn, server_buffer, sizeof(server_buffer), &src, &src_len, &port)) < 0) { puts("Error while receiving"); } else if (res == 0) { puts("No data received"); } else { server_buffer[res] = '\0'; if (gnrc_rpl_instances[0].state && gnrc_rpl_instances[0].dodag.node_status == GNRC_RPL_ROOT_NODE) { printf("%s;%s\n", ipv6_addr_to_str(src_str, &src, sizeof(src_str)), server_buffer); ipv6_addr_to_str(addr_str, &ipv6_addr_all_nodes_link_local, sizeof(addr_str)); arg[1] = addr_str; arg[3] = src_str; udp_send(4, arg); } else { ipv6_addr_t payload; ipv6_addr_from_str(&payload, server_buffer); if ((gnrc_ipv6_netif_find_by_addr(NULL, &payload) != KERNEL_PID_UNDEF) && (!acked)) { acked = true; printf("diff: %llu\n", xtimer_now64() - time); } } } } return NULL; }
void *microcoap_server(void *arg) { (void) arg; msg_init_queue(_coap_msg_q, Q_SZ); uint8_t laddr[16] = { 0 }; uint8_t raddr[16] = { 0 }; size_t raddr_len; uint16_t rport; conn_udp_t conn; int rc = conn_udp_create(&conn, laddr, sizeof(laddr), AF_INET6, COAP_SERVER_PORT); while (1) { if ((rc = conn_udp_recvfrom(&conn, (char *)udp_buf, sizeof(udp_buf), raddr, &raddr_len, &rport)) < 0) { continue; } coap_packet_t pkt; /* parse UDP packet to CoAP */ if (0 == (rc = coap_parse(&pkt, udp_buf, rc))) { coap_packet_t rsppkt; /* handle CoAP request */ coap_handle_req(&scratch_buf, &pkt, &rsppkt, false, false); /* build reply */ size_t rsplen = sizeof(udp_buf); if ((rc = coap_build(udp_buf, &rsplen, &rsppkt)) == 0) { /* send reply via UDP */ rc = conn_udp_sendto(udp_buf, rsplen, NULL, 0, raddr, raddr_len, AF_INET6, COAP_SERVER_PORT, rport); } } } /* never reached */ return NULL; }