Jan Breuer
2015-10-12 6110e0eeedb48c81fad0e5175aa3639f1a703bfa
examples/test-tcp-srq/main.c
@@ -51,8 +51,6 @@
#define CONTROL_PORT 5026
typedef struct {
    int io;
    int io_listen;
@@ -64,7 +62,7 @@
size_t SCPI_Write(scpi_t * context, const char * data, size_t len) {
    if (context->user_context != NULL) {
        user_data_t * u = (user_data_t *)(context->user_context);
        user_data_t * u = (user_data_t *) (context->user_context);
        if (u->fio) {
            return fwrite(data, 1, len, u->fio);
        }
@@ -72,9 +70,9 @@
    return 0;
}
scpi_result_t SCPI_Flush(scpi_t * context) {
scpi_result_t SCPI_Flush(scpi_t * context) {
    if (context->user_context != NULL) {
        user_data_t * u = (user_data_t *)(context->user_context);
        user_data_t * u = (user_data_t *) (context->user_context);
        if (u->fio) {
            return fflush(u->fio) == 0 ? SCPI_RES_OK : SCPI_RES_ERR;
        }
@@ -89,7 +87,6 @@
    return 0;
}
scpi_result_t SCPI_Control(scpi_t * context, scpi_ctrl_name_t ctrl, scpi_reg_val_t val) {
    char b[16];
@@ -98,14 +95,14 @@
    } else {
        fprintf(stderr, "**CTRL %02x: 0x%X (%d)\r\n", ctrl, val, val);
    }
    if (context->user_context != NULL) {
        user_data_t * u = (user_data_t *)(context->user_context);
        user_data_t * u = (user_data_t *) (context->user_context);
        if (u->control_io >= 0) {
            snprintf(b, sizeof(b), "SRQ%d\r\n", val);
            snprintf(b, sizeof (b), "SRQ%d\r\n", val);
            return write(u->control_io, b, strlen(b)) > 0 ? SCPI_RES_OK : SCPI_RES_ERR;
        }
    }
    }
    return SCPI_RES_OK;
}
@@ -124,108 +121,102 @@
    int rc;
    int on = 1;
    struct sockaddr_in servaddr;
    /* Configure TCP Server */
    bzero(&servaddr, sizeof(servaddr));
    bzero(&servaddr, sizeof (servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
    servaddr.sin_port=htons(port);
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(port);
    /* Create socket */
    fd = socket(AF_INET,SOCK_STREAM, 0);
    if (fd < 0)
    {
    fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd < 0) {
        perror("socket() failed");
        exit(-1);
    }
    }
    /* Set address reuse enable */
    rc = setsockopt(fd, SOL_SOCKET,  SO_REUSEADDR, (char *)&on, sizeof(on));
    if (rc < 0)
    {
    rc = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on));
    if (rc < 0) {
        perror("setsockopt() failed");
        close(fd);
        exit(-1);
    }
    /* Set non blocking */
    rc = ioctl(fd, FIONBIO, (char *)&on);
    if (rc < 0)
    {
    rc = ioctl(fd, FIONBIO, (char *) &on);
    if (rc < 0) {
        perror("ioctl() failed");
        close(fd);
        exit(-1);
    }
    }
    /* Bind to socket */
    rc = bind(fd, (struct sockaddr *)&servaddr, sizeof(servaddr));
    if (rc < 0)
    {
    rc = bind(fd, (struct sockaddr *) &servaddr, sizeof (servaddr));
    if (rc < 0) {
        perror("bind() failed");
        close(fd);
        exit(-1);
    }
    /* Listen on socket */
    listen(fd, 1);
    if (rc < 0)
    {
    if (rc < 0) {
        perror("listen() failed");
        close(fd);
        exit(-1);
    }
    return fd;
}
static int waitServer(user_data_t * user_data) {
    struct timeval timeout;
    int rc;
    FD_ZERO(&user_data->fds);
    if (user_data->io >= 0) {
        FD_SET(user_data->io, &user_data->fds);
    }
    if (user_data->io_listen >= 0) {
        FD_SET(user_data->io_listen, &user_data->fds);
    }
    if (user_data->control_io >= 0) {
        FD_SET(user_data->control_io, &user_data->fds);
    }
    if (user_data->control_io_listen >= 0) {
        FD_SET(user_data->control_io_listen, &user_data->fds);
    }
    timeout.tv_sec  = 5;
    timeout.tv_sec = 5;
    timeout.tv_usec = 0;
    rc = select(FD_SETSIZE, &user_data->fds, NULL, NULL, &timeout);
    return rc;
}
static int processIoListen(user_data_t * user_data) {
    struct sockaddr_in cliaddr;
    socklen_t clilen;
    clilen = sizeof(cliaddr);
    user_data->io = accept(user_data->io_listen, (struct sockaddr *)&cliaddr, &clilen);
    clilen = sizeof (cliaddr);
    user_data->io = accept(user_data->io_listen, (struct sockaddr *) &cliaddr, &clilen);
    user_data->fio = fdopen(user_data->io, "r+");
    printf("Connection established %s\r\n", inet_ntoa(cliaddr.sin_addr));
}
static int processSrqIoListen(user_data_t * user_data) {
    struct sockaddr_in cliaddr;
    socklen_t clilen;
    clilen = sizeof(cliaddr);
    clilen = sizeof (cliaddr);
    user_data->control_io = accept(user_data->control_io_listen, (struct sockaddr *)&cliaddr, &clilen);
    user_data->control_io = accept(user_data->control_io_listen, (struct sockaddr *) &cliaddr, &clilen);
    printf("Control Connection established %s\r\n", inet_ntoa(cliaddr.sin_addr));
}
@@ -243,7 +234,7 @@
static int processIo(user_data_t * user_data) {
    int rc;
    char smbuffer[10];
    rc = recv(user_data->io, smbuffer, sizeof(smbuffer), 0);
    rc = recv(user_data->io, smbuffer, sizeof (smbuffer), 0);
    if (rc < 0) {
        if (errno != EWOULDBLOCK) {
            closeIo(user_data);
@@ -259,8 +250,8 @@
static int processSrqIo(user_data_t * user_data) {
    int rc;
    char smbuffer[10];
    rc = recv(user_data->control_io, smbuffer, sizeof(smbuffer), 0);
    char smbuffer[10];
    rc = recv(user_data->control_io, smbuffer, sizeof (smbuffer), 0);
    if (rc < 0) {
        if (errno != EWOULDBLOCK) {
            closeSrqIo(user_data);
@@ -281,7 +272,7 @@
    (void) argc;
    (void) argv;
    int rc;
    user_data_t user_data = {
        .io_listen = -1,
        .io = -1,
@@ -292,24 +283,24 @@
    // user_context will be pointer to socket
    scpi_context.user_context = &user_data;
    SCPI_Init(&scpi_context);
    user_data.io_listen = createServer(5025);
    user_data.control_io_listen = createServer(CONTROL_PORT);
    while(1) {
    while (1) {
        rc = waitServer(&user_data);
        if (rc < 0) { // failed
            perror("select failed");
            exit(-1);
        }
        if (rc == 0) { // timeout
            SCPI_Input(&scpi_context, NULL, 0);
        }
        if ((user_data.io_listen >= 0) && FD_ISSET(user_data.io_listen, &user_data.fds)) {
            processIoListen(&user_data);
        }
@@ -317,17 +308,17 @@
        if ((user_data.control_io_listen >= 0) && FD_ISSET(user_data.control_io_listen, &user_data.fds)) {
            processSrqIoListen(&user_data);
        }
        if ((user_data.io >= 0) && FD_ISSET(user_data.io, &user_data.fds)) {
            processIo(&user_data);
        }
        if ((user_data.control_io >= 0) && FD_ISSET(user_data.control_io, &user_data.fds)) {
            processSrqIo(&user_data);
        }
    }
    return (EXIT_SUCCESS);
}