Esempio n. 1
0
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));
            }
        }
    }
}
Esempio n. 2
0
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;
}