Jan Breuer
2015-11-13 a3c8f8efbfa31f9c093237dd8647bff9554efeac
examples/test-tcp-srq/main.c
@@ -44,13 +44,12 @@
#include <sys/ioctl.h>
#include <errno.h>
#include <arpa/inet.h>
#include <unistd.h>
#include "scpi/scpi.h"
#include "../common/scpi-def.h"
#define CONTROL_PORT 5026
typedef struct {
    int io;
@@ -63,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);
        }
@@ -71,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;
        }
@@ -88,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];
@@ -97,24 +95,26 @@
    } 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;
}
scpi_result_t SCPI_Reset(scpi_t * context) {
    (void) context;
    fprintf(stderr, "**Reset\r\n");
    return SCPI_RES_OK;
}
scpi_result_t SCPI_SystemCommTcpipControlQ(scpi_t * context) {
    SCPI_ResultInt(context, CONTROL_PORT);
    SCPI_ResultInt32(context, CONTROL_PORT);
    return SCPI_RES_OK;
}
@@ -123,108 +123,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) {
static void 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) {
static void 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));
}
@@ -239,10 +233,10 @@
    user_data->control_io = -1;
}
static int processIo(user_data_t * user_data) {
static void 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);
@@ -256,10 +250,10 @@
    }
}
static int processSrqIo(user_data_t * user_data) {
static void 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);
@@ -280,7 +274,7 @@
    (void) argc;
    (void) argv;
    int rc;
    user_data_t user_data = {
        .io_listen = -1,
        .io = -1,
@@ -291,24 +285,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);
        }
@@ -316,17 +310,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);
}