Пример #1
0
static void
handle_signals(int signum)
{
    switch (signum) {
    case SIGPIPE:
        printf("ERROR: Received SIGPIPE.. exiting now\n");
        handle_cleanup();
        break;

    default:
        break;
    }
    return;
}
Пример #2
0
static gboolean
handle_incoming (UfoDaemon *daemon, UfoMessage *msg)
{
    g_debug ("handling %s", ufo_message_type_to_char (msg->type));
    switch (msg->type) {
        case UFO_MESSAGE_GET_NUM_DEVICES:
            handle_get_num_devices (daemon);
            break;
        case UFO_MESSAGE_GET_NUM_CPUS:
            handle_get_num_cpus (daemon);
            break;
        case UFO_MESSAGE_STREAM_JSON:
            handle_stream_json (daemon, msg);
            break;
        case UFO_MESSAGE_REPLICATE_JSON:
            handle_replicate_json (daemon, msg);
            break;
        case UFO_MESSAGE_GET_STRUCTURE:
            handle_get_structure (daemon);
            break;
        case UFO_MESSAGE_SEND_INPUTS_REQUISITION:
            handle_send_inputs (daemon, msg);
            break;
        case UFO_MESSAGE_GET_REQUISITION:
            handle_get_requisition (daemon);
            break;
        case UFO_MESSAGE_GET_RESULT:
            handle_get_result (daemon);
            break;
        case UFO_MESSAGE_CLEANUP:
            handle_cleanup (daemon);
            break;
        case UFO_MESSAGE_TERMINATE:
            handle_terminate (daemon);
            return FALSE;
            break;
        default:
            g_message ("Unknown message received\n");
    }
    return TRUE;
}
Пример #3
0
int
main(int argc, char **argv) {
    int                 opt = 0;
    int                 nbytes = 0;
    int                 cli_len = 0;
    char                buf[BUF_SIZE] = "";
    struct sockaddr_in  serv_addr;
    struct sockaddr_in  cli_addr;
    struct hostent      *cli_host;

    if (2 != argc) {
        printf("ERROR: Incorrect usage. See help.\n");
        print_usage(argv[0]);
        goto error_exit;
    }
    signal(SIGPIPE, handle_signals);

    /* Create server socket. */
    g_serv_sock = socket(AF_INET, SOCK_DGRAM, 0);
    if (g_serv_sock < 0) {
        error("ERROR: socket failed");
        goto error_exit;
    }

    /* Set sockopt to resue socket imm'ly after the process quits. */
    opt = 1;
    setsockopt(g_serv_sock, SOL_SOCKET, SO_REUSEADDR, 
            (const void *) &opt , sizeof(int));

    /* Fill-in server details. */
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(atoi(argv[1]));

    /* Bind the socket to the addr. */
    if (bind(g_serv_sock, (struct sockaddr *) &serv_addr,
                sizeof(serv_addr)) < 0) {
        perror("ERROR: bind failed on binding");
        goto error_exit;
    }

    /* Data transfer starts here. */
    cli_len = sizeof(cli_addr);
    printf("Waiting for clients to connect..\n");
    while (1) {
        nbytes = 0;
        memset(&buf, 0, sizeof(buf));
        nbytes = recvfrom(g_serv_sock, buf, sizeof(buf), 0,
                (struct sockaddr *) &cli_addr, &cli_len);
        if (nbytes < 0) {
            perror("ERROR: recvfrom failed");
            goto error_exit;
        }
        buf[nbytes] = '\0';
        printf("CLIENT: %s", buf);

        /* Echo the data back to client. */
        nbytes = sendto(g_serv_sock, buf, strlen(buf), 0, 
	       (struct sockaddr *) &cli_addr, cli_len);
        if (nbytes < 0) {
            perror("ERROR: sendto failed");
            goto error_exit;
        }
    }

    handle_cleanup();
    return 0;

error_exit:
    handle_cleanup();
    return -1;
}