int main(void) { int fd; #ifdef IPV6 struct sockaddr_in6 servaddr, cliaddr; #else /* IPV6 */ struct sockaddr_in servaddr, cliaddr; #endif /* IPV6 */ uint8_t buf[1024]; #ifdef IPV6 fd = socket(AF_INET6,SOCK_DGRAM,0); #else /* IPV6 */ fd = socket(AF_INET,SOCK_DGRAM,0); #endif /* IPV6 */ bzero(&servaddr,sizeof(servaddr)); #ifdef IPV6 servaddr.sin6_family = AF_INET6; servaddr.sin6_addr = in6addr_any; servaddr.sin6_port = htons(COAP_DEFAULT_PORT); #else /* IPV6 */ servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(COAP_DEFAULT_PORT); #endif /* IPV6 */ bind(fd,(struct sockaddr *)&servaddr, sizeof(servaddr)); resource_setup(resources); while(1) { int n, rc; socklen_t len = sizeof(cliaddr); coap_packet_t pkt; n = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr *)&cliaddr, &len); #ifdef YACOAP_DEBUG printf("Received: "); coap_dump(buf, n, true); printf("\n"); #endif if ((rc = coap_parse(buf, n, &pkt)) > COAP_ERR) printf("Bad packet rc=%d\n", rc); else { size_t buflen = sizeof(buf); coap_packet_t rsppkt; #ifdef YACOAP_DEBUG coap_dump_packet(&pkt); #endif coap_handle_request(resources, &pkt, &rsppkt); if ((rc = coap_build(&rsppkt, buf, &buflen)) > COAP_ERR) printf("coap_build failed rc=%d\n", rc); else { #ifdef YACOAP_DEBUG printf("Sending: "); coap_dump(buf, buflen, true); printf("\n"); #endif #ifdef YACOAP_DEBUG coap_dump_packet(&rsppkt); #endif sendto(fd, buf, buflen, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr)); } } } }
static void *coap_server_thread(void *args) { struct sockaddr_in6 server_addr; uint16_t port; coap_packet_t inpkt; coap_packet_t outpkt; int bad_packet; size_t rsplen; msg_init_queue(server_msg_queue, SERVER_MSG_QUEUE_SIZE); server_socket = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); /* parse port */ port = (uint16_t)atoi((char *)args); if (port == 0) { puts("ERROR: invalid port specified"); return NULL; } server_addr.sin6_family = AF_INET6; memset(&server_addr.sin6_addr, 0, sizeof(server_addr.sin6_addr)); server_addr.sin6_port = htons(port); if (server_socket < 0) { puts("ERROR initializing socket"); server_socket = 0; return NULL; } if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { server_socket = -1; puts("ERROR binding socket"); return NULL; } printf("Success: started UDP server on port %" PRIu16 "\n", port); while (1) { int res; struct sockaddr_in6 src; socklen_t src_len = sizeof(struct sockaddr_in6); res = recvfrom(server_socket, server_buffer, sizeof(server_buffer), 0, (struct sockaddr *)&src, &src_len); if (res < 0) { puts("ERROR on receive"); continue; } if (res == 0) { puts("Peer shut down"); continue; } printf("Received data: "); puts(server_buffer); bad_packet = coap_parse(&inpkt, (uint8_t *)server_buffer, res); if (bad_packet) { puts("ERROR: malformed CoAP packet"); continue; } coap_dump_packet(&inpkt); bad_packet = coap_handle_req(&scratch, &inpkt, &outpkt, true, false); if (bad_packet) { puts("ERROR: coap_handle_req failed"); } bad_packet = coap_build(pkt_buf, &rsplen, &outpkt); if (bad_packet) { printf("ERROR: could not build CoAP packet: %d\n", bad_packet); continue; } res = sendto(server_socket, (void *)&pkt_buf, rsplen, 0, (struct sockaddr *)&src, src_len); if (res == -1) { puts("ERROR: could not send reply"); } } return NULL; }