示例#1
0
static void *worker (void *ctx_)
#endif
{
    void *s;
    int rc;
    int i;
    xs_msg_t msg;

    s = xs_socket (ctx_, XS_REP);
    if (!s) {
        printf ("error in xs_socket: %s\n", xs_strerror (errno));
        exit (1);
    }

    rc = xs_connect (s, "inproc://lat_test");
    if (rc == -1) {
        printf ("error in xs_connect: %s\n", xs_strerror (errno));
        exit (1);
    }

    rc = xs_msg_init (&msg);
    if (rc != 0) {
        printf ("error in xs_msg_init: %s\n", xs_strerror (errno));
        exit (1);
    }

    for (i = 0; i != roundtrip_count; i++) {
        rc = xs_recvmsg (s, &msg, 0);
        if (rc < 0) {
            printf ("error in xs_recvmsg: %s\n", xs_strerror (errno));
            exit (1);
        }
        rc = xs_sendmsg (s, &msg, 0);
        if (rc < 0) {
            printf ("error in xs_sendmsg: %s\n", xs_strerror (errno));
            exit (1);
        }
    }

    rc = xs_msg_close (&msg);
    if (rc != 0) {
        printf ("error in xs_msg_close: %s\n", xs_strerror (errno));
        exit (1);
    }

    rc = xs_close (s);
    if (rc != 0) {
        printf ("error in xs_close: %s\n", xs_strerror (errno));
        exit (1);
    }

#if defined XS_HAVE_WINDOWS
    return 0;
#else
    return NULL;
#endif
}
示例#2
0
static void *worker (void *ctx_)
#endif
{
    void *s;
    int rc;
    int i;
    xs_msg_t msg;

    s = xs_socket (ctx_, XS_PUSH);
    if (!s) {
        printf ("error in xs_socket: %s\n", xs_strerror (errno));
        exit (1);
    }

    rc = xs_connect (s, "inproc://thr_test");
    if (rc == -1) {
        printf ("error in xs_connect: %s\n", xs_strerror (errno));
        exit (1);
    }

    for (i = 0; i != message_count; i++) {

        rc = xs_msg_init_size (&msg, message_size);
        if (rc != 0) {
            printf ("error in xs_msg_init_size: %s\n", xs_strerror (errno));
            exit (1);
        }
#if defined XS_MAKE_VALGRIND_HAPPY
        memset (xs_msg_data (&msg), 0, message_size);
#endif

        rc = xs_sendmsg (s, &msg, 0);
        if (rc < 0) {
            printf ("error in xs_sendmsg: %s\n", xs_strerror (errno));
            exit (1);
        }
        rc = xs_msg_close (&msg);
        if (rc != 0) {
            printf ("error in xs_msg_close: %s\n", xs_strerror (errno));
            exit (1);
        }
    }

    rc = xs_close (s);
    if (rc != 0) {
        printf ("error in xs_close: %s\n", xs_strerror (errno));
        exit (1);
    }

#if defined XS_HAVE_WINDOWS
    return 0;
#else
    return NULL;
#endif
}
示例#3
0
文件: xszmq.cpp 项目: adeze/libxs
int zmq_device (int device, void *frontend, void *backend)
{
    int more;
    size_t size;
    xs_msg_t msg;
    xs_pollitem_t items [2];

    int rc = xs_msg_init (&msg);
    if (rc != 0)
        return -1;

    items [0].socket = frontend;
    items [0].events = XS_POLLIN;
    items [1].socket = backend;
    items [1].events = XS_POLLIN;

    while (1) {

        rc = xs_poll (&items [0], 2, -1);
        if (rc < 0)
            return -1;

        if (items [0].revents & XS_POLLIN) {
            while (1) {

                rc = xs_recvmsg (frontend, &msg, 0);
                if (rc < 0)
                    return -1;

                size = sizeof (more);
                rc = xs_getsockopt (frontend, XS_RCVMORE, &more, &size);
                if (rc < 0)
                    return -1;

                rc = xs_sendmsg (backend, &msg, more ? XS_SNDMORE : 0);
                if (rc < 0)
                    return -1;

                if (!more)
                    break;
            }
        }

        if (items [1].revents & XS_POLLIN) {
            while (1) {

                rc = xs_recvmsg (backend, &msg, 0);
                if (rc < 0)
                    return -1;

                size = sizeof (more);
                rc = xs_getsockopt (backend, XS_RCVMORE, &more, &size);
                if (rc < 0)
                    return -1;

                rc = xs_sendmsg (frontend, &msg, more ? ZMQ_SNDMORE : 0);
                if (rc < 0)
                    return -1;

                if (!more)
                    break;
            }
        }
    }

    return 0;
}
示例#4
0
文件: xszmq.cpp 项目: adeze/libxs
int zmq_send (void *s, zmq_msg_t *msg, int flags)
{
    int rc = xs_sendmsg (s, (xs_msg_t*) msg->content, flags);
    return rc < 0 ? -1 : 0;
}
示例#5
0
int main (int argc, char *argv [])
{
#if defined XS_HAVE_WINDOWS
    HANDLE local_thread;
#else
    pthread_t local_thread;
#endif
    void *ctx;
    void *s;
    int rc;
    int i;
    xs_msg_t msg;
    void *watch;
    unsigned long elapsed;
    double latency;

    if (argc != 3) {
        printf ("usage: inproc_lat <message-size> <roundtrip-count>\n");
        return 1;
    }

    message_size = atoi (argv [1]);
    roundtrip_count = atoi (argv [2]);

    ctx = xs_init ();
    if (!ctx) {
        printf ("error in xs_init: %s\n", xs_strerror (errno));
        return -1;
    }

    s = xs_socket (ctx, XS_REQ);
    if (!s) {
        printf ("error in xs_socket: %s\n", xs_strerror (errno));
        return -1;
    }

    rc = xs_bind (s, "inproc://lat_test");
    if (rc == -1) {
        printf ("error in xs_bind: %s\n", xs_strerror (errno));
        return -1;
    }

#if defined XS_HAVE_WINDOWS
    local_thread = (HANDLE) _beginthreadex (NULL, 0,
        worker, ctx, 0 , NULL);
    if (local_thread == 0) {
        printf ("error in _beginthreadex\n");
        return -1;
    }
#else
    rc = pthread_create (&local_thread, NULL, worker, ctx);
    if (rc != 0) {
        printf ("error in pthread_create: %s\n", xs_strerror (rc));
        return -1;
    }
#endif

    rc = xs_msg_init_size (&msg, message_size);
    if (rc != 0) {
        printf ("error in xs_msg_init_size: %s\n", xs_strerror (errno));
        return -1;
    }
    memset (xs_msg_data (&msg), 0, message_size);

    printf ("message size: %d [B]\n", (int) message_size);
    printf ("roundtrip count: %d\n", (int) roundtrip_count);

    watch = xs_stopwatch_start ();

    for (i = 0; i != roundtrip_count; i++) {
        rc = xs_sendmsg (s, &msg, 0);
        if (rc < 0) {
            printf ("error in xs_sendmsg: %s\n", xs_strerror (errno));
            return -1;
        }
        rc = xs_recvmsg (s, &msg, 0);
        if (rc < 0) {
            printf ("error in xs_recvmsg: %s\n", xs_strerror (errno));
            return -1;
        }
        if (xs_msg_size (&msg) != message_size) {
            printf ("message of incorrect size received\n");
            return -1;
        }
    }

    elapsed = xs_stopwatch_stop (watch);

    rc = xs_msg_close (&msg);
    if (rc != 0) {
        printf ("error in xs_msg_close: %s\n", xs_strerror (errno));
        return -1;
    }

    latency = (double) elapsed / (roundtrip_count * 2);

#if defined XS_HAVE_WINDOWS
    DWORD rc2 = WaitForSingleObject (local_thread, INFINITE);
    if (rc2 == WAIT_FAILED) {
        printf ("error in WaitForSingleObject\n");
        return -1;
    }
    BOOL rc3 = CloseHandle (local_thread);
    if (rc3 == 0) {
        printf ("error in CloseHandle\n");
        return -1;
    }
#else
    rc = pthread_join (local_thread, NULL);
    if (rc != 0) {
        printf ("error in pthread_join: %s\n", xs_strerror (rc));
        return -1;
    }
#endif

    printf ("average latency: %.3f [us]\n", (double) latency);

    rc = xs_close (s);
    if (rc != 0) {
        printf ("error in xs_close: %s\n", xs_strerror (errno));
        return -1;
    }

    rc = xs_term (ctx);
    if (rc != 0) {
        printf ("error in xs_term: %s\n", xs_strerror (errno));
        return -1;
    }

    return 0;
}
示例#6
0
int XS_TEST_MAIN ()
{
    fprintf (stderr, "reqrep_device test running...\n");

    void *ctx = xs_init ();
    errno_assert (ctx);

    //  Create a req/rep device.
    void *xreq = xs_socket (ctx, XS_XREQ);
    errno_assert (xreq);
    int rc = xs_bind (xreq, "tcp://127.0.0.1:5560");
    errno_assert (rc != -1);
    void *xrep = xs_socket (ctx, XS_XREP);
    errno_assert (xrep);
    rc = xs_bind (xrep, "tcp://127.0.0.1:5561");
    errno_assert (rc != -1);

    //  Create a worker.
    void *rep = xs_socket (ctx, XS_REP);
    errno_assert (rep);
    rc = xs_connect (rep, "tcp://127.0.0.1:5560");
    errno_assert (rc != -1);

    //  Create a client.
    void *req = xs_socket (ctx, XS_REQ);
    errno_assert (req);
    rc = xs_connect (req, "tcp://127.0.0.1:5561");
    errno_assert (rc != -1);

    //  Send a request.
    rc = xs_send (req, "ABC", 3, XS_SNDMORE);
    errno_assert (rc == 3);
    rc = xs_send (req, "DEF", 3, 0);
    errno_assert (rc == 3);

    //  Pass the request through the device.
    for (int i = 0; i != 4; i++) {
        xs_msg_t msg;
        rc = xs_msg_init (&msg);
        errno_assert (rc == 0);
        rc = xs_recvmsg (xrep, &msg, 0);
        errno_assert (rc >= 0);
        int rcvmore;
        size_t sz = sizeof (rcvmore);
        rc = xs_getsockopt (xrep, XS_RCVMORE, &rcvmore, &sz);
        errno_assert (rc == 0);
        rc = xs_sendmsg (xreq, &msg, rcvmore ? XS_SNDMORE : 0);
        errno_assert (rc >= 0);
    }

    //  Receive the request.
    char buff [3];
    rc = xs_recv (rep, buff, 3, 0);
    errno_assert (rc == 3);
    assert (memcmp (buff, "ABC", 3) == 0);
    int rcvmore;
    size_t sz = sizeof (rcvmore);
    rc = xs_getsockopt (rep, XS_RCVMORE, &rcvmore, &sz);
    errno_assert (rc == 0);
    assert (rcvmore);
    rc = xs_recv (rep, buff, 3, 0);
    errno_assert (rc == 3);
    assert (memcmp (buff, "DEF", 3) == 0);
    rc = xs_getsockopt (rep, XS_RCVMORE, &rcvmore, &sz);
    errno_assert (rc == 0);
    assert (!rcvmore);

    //  Send the reply.
    rc = xs_send (rep, "GHI", 3, XS_SNDMORE);
    errno_assert (rc == 3);
    rc = xs_send (rep, "JKL", 3, 0);
    errno_assert (rc == 3);

    //  Pass the reply through the device.
    for (int i = 0; i != 4; i++) {
        xs_msg_t msg;
        rc = xs_msg_init (&msg);
        errno_assert (rc == 0);
        rc = xs_recvmsg (xreq, &msg, 0);
        errno_assert (rc >= 0);
        rc = xs_getsockopt (xreq, XS_RCVMORE, &rcvmore, &sz);
        errno_assert (rc == 0);
        rc = xs_sendmsg (xrep, &msg, rcvmore ? XS_SNDMORE : 0);
        errno_assert (rc >= 0);
    }

    //  Receive the reply.
    rc = xs_recv (req, buff, 3, 0);
    errno_assert (rc == 3);
    assert (memcmp (buff, "GHI", 3) == 0);
    rc = xs_getsockopt (req, XS_RCVMORE, &rcvmore, &sz);
    errno_assert (rc == 0);
    assert (rcvmore);
    rc = xs_recv (req, buff, 3, 0);
    errno_assert (rc == 3);
    assert (memcmp (buff, "JKL", 3) == 0);
    rc = xs_getsockopt (req, XS_RCVMORE, &rcvmore, &sz);
    errno_assert (rc == 0);
    assert (!rcvmore);

    //  Clean up.
    rc = xs_close (req);
    errno_assert (rc == 0);
    rc = xs_close (rep);
    errno_assert (rc == 0);
    rc = xs_close (xrep);
    errno_assert (rc == 0);
    rc = xs_close (xreq);
    errno_assert (rc == 0);
    rc = xs_term (ctx);
    errno_assert (rc == 0);

    return 0 ;
}
示例#7
0
int main (int argc, char *argv [])
{
    const char *connect_to;
    int roundtrip_count;
    size_t message_size;
    void *ctx;
    void *s;
    int rc;
    int i;
    xs_msg_t msg;
    void *watch;
    unsigned long elapsed;
    double latency;

    if (argc != 4) {
        printf ("usage: remote_lat <connect-to> <message-size> "
            "<roundtrip-count>\n");
        return 1;
    }
    connect_to = argv [1];
    message_size = atoi (argv [2]);
    roundtrip_count = atoi (argv [3]);

    ctx = xs_init ();
    if (!ctx) {
        printf ("error in xs_init: %s\n", xs_strerror (errno));
        return -1;
    }

    s = xs_socket (ctx, XS_REQ);
    if (!s) {
        printf ("error in xs_socket: %s\n", xs_strerror (errno));
        return -1;
    }

    rc = xs_connect (s, connect_to);
    if (rc == -1) {
        printf ("error in xs_connect: %s\n", xs_strerror (errno));
        return -1;
    }

    rc = xs_msg_init_size (&msg, message_size);
    if (rc != 0) {
        printf ("error in xs_msg_init_size: %s\n", xs_strerror (errno));
        return -1;
    }
    memset (xs_msg_data (&msg), 0, message_size);

    watch = xs_stopwatch_start ();

    for (i = 0; i != roundtrip_count; i++) {
        rc = xs_sendmsg (s, &msg, 0);
        if (rc < 0) {
            printf ("error in xs_sendmsg: %s\n", xs_strerror (errno));
            return -1;
        }
        rc = xs_recvmsg (s, &msg, 0);
        if (rc < 0) {
            printf ("error in xs_recvmsg: %s\n", xs_strerror (errno));
            return -1;
        }
        if (xs_msg_size (&msg) != message_size) {
            printf ("message of incorrect size received\n");
            return -1;
        }
    }

    elapsed = xs_stopwatch_stop (watch);

    rc = xs_msg_close (&msg);
    if (rc != 0) {
        printf ("error in xs_msg_close: %s\n", xs_strerror (errno));
        return -1;
    }

    latency = (double) elapsed / (roundtrip_count * 2);

    printf ("message size: %d [B]\n", (int) message_size);
    printf ("roundtrip count: %d\n", (int) roundtrip_count);
    printf ("average latency: %.3f [us]\n", (double) latency);

    rc = xs_close (s);
    if (rc != 0) {
        printf ("error in xs_close: %s\n", xs_strerror (errno));
        return -1;
    }

    rc = xs_term (ctx);
    if (rc != 0) {
        printf ("error in xs_term: %s\n", xs_strerror (errno));
        return -1;
    }

    return 0;
}