server.c

An example of a netpp server main loop. If the CONFIG_* variables are defined, the server listens on both USB and TCP ports. Note that concurrent property accesses must be handled by the user. The netpp library does not implement locking.

#ifdef DEBUG
#define DEB(x) x
#endif

#include "slave.h"
#include "devlib_error.h"

#include <stdio.h>

int start_server(int argc, char **argv)
{
#ifdef CONFIG_UDP
        ServerContext udpserv;
#endif
#ifdef CONFIG_USBFIFO
        RemoteDevice usb;
#endif
#ifdef CONFIG_DEVICE
        const char *devname = NULL;
        RemoteDevice dev;
#endif
#ifdef CONFIG_TCP
        ServerContext tcpserv;
#endif
        int error;
#if defined(CONFIG_UDP) // || defined (CONFIG_TCP)
        ServerContext discoveryserv;
#endif
#if defined(CONFIG_UDP) || defined (CONFIG_TCP)
        int port = DEFAULT_LISTEN_PORT;
#endif

        serverports_init();

#ifdef CONFIG_DEVICE
        if (argc >= 2) {
                devname = argv[1];
                dev.peer.user = (void *) devname;
                error = dev_server_init(&dev.peer);
                if (error < 0) {
                        printf("Error initializing DEV server\n");
                        return -1;
                }
                printf("Using device %s\n", devname);
        }
#endif

#ifdef CONFIG_USBFIFO
        error = usb_server_init(&usb.peer);
        if (error < 0) {
                printf("Error initializing USB\n");
                return -1;
        }
        printf("Listening to USBFIFO\n");
#endif

#if defined(CONFIG_UDP) // || defined (CONFIG_TCP)
        error = udp_server_init(DISCOVERY_PORT, &discoveryserv);
        if (error < 0) {
                printf("Error initializing discovery protocol UDP server\n");
                return -1;
        }
        printf("ProbeServer listening on UDP Port %d...\n", DISCOVERY_PORT);
        
#endif

#ifdef CONFIG_UDP
        error = udp_server_init(port, &udpserv);
        if (error < 0) {
                printf("Error initializing socket\n");
                return -1;
        }
        printf("Listening on UDP Port %d...\n", port);
#endif

#ifdef CONFIG_TCP
        error = tcp_server_init(port, &tcpserv);
        if (error < 0) {
                printf("Error initializing socket\n");
                return -1;
        }
        printf("Listening on TCP Port %d...\n", port);
#endif

#ifdef DEBUG
        printf("Servers running:\n");
        portbay_list(GET_PORTROOT());
        printf("------------------------\n");
#endif

        while (1) {
                // Serve USB:
#ifdef CONFIG_USBFIFO
                slave_handler(&usb);
#endif
#ifdef CONFIG_DEVICE
                if (devname)
                        slave_handler(&dev);
#endif

#if defined(CONFIG_UDP) // || defined (CONFIG_TCP)
                error = udp_listen_incoming(&discoveryserv, 1);
                if (error < 0) {
                        printf("UDP discovery server error\n");
                        error = DCERR_COMM_DISCONNECT;
                        break;
                }
#endif

#ifdef CONFIG_UDP
                error = udp_serve(&udpserv);
                if (error < 0) {
                        printf("UDP server error\n");
                        error = DCERR_COMM_DISCONNECT;
                        break;
                }

#endif
                // First, we serve existing (logged in) TCP users
#ifdef CONFIG_TCP
                error = net_serve_users(&tcpserv);
                if (error < 0) {
                        printf("TCP server error\n");
                        error = DCERR_COMM_DISCONNECT;
                        break;
                }
                // Here, we listen to new incoming connections
                error = tcp_listen_incoming(&tcpserv);
                if (error < 0) {
                        printf("TCP listen error\n");
                        break;
                }
#endif
        }

        // We clean up:
#ifdef CONFIG_TCP
        net_disconnect_users(&tcpserv);
        tcp_server_exit(&tcpserv);
#endif
        
#ifdef CONFIG_UDP
        net_disconnect_users(&udpserv);
        udp_server_exit(&udpserv);
#endif

        return error;
}


Generated on Thu Feb 24 13:50:16 2011 for Device Control library by  doxygen 1.6.1