Guest User

zmqlibevserver

a guest
Oct 15th, 2013
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.49 KB | None | 0 0
  1.     #include <stdio.h>
  2.     #include <stdint.h>
  3.     #include <stdlib.h>
  4.     #include <string.h>
  5.     #include <stdbool.h>
  6.     #include <ctype.h>
  7.     #include <zmq.h>
  8.     #include <ev.h>
  9.  
  10.     void *zmq_ctx = NULL;
  11.     void *sock;
  12.     bool sending = false;
  13.  
  14.    
  15.  
  16.     void watcher_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)
  17.     {
  18.         uint32_t events;
  19.         size_t opt_len = sizeof(uint32_t);
  20.  
  21.         fprintf(stderr, "Event: EV revents=%d\n", revents);
  22.         if (EV_ERROR & revents)
  23.         {
  24.         fprintf(stderr, "invalid event\n");
  25.         return;
  26.         }
  27.  
  28.         while(1) {
  29.         if (0 != zmq_getsockopt(sock, ZMQ_EVENTS, &events, &opt_len))
  30.         {
  31.             fprintf(stderr, "ZMQ_EVENTS failed\n");
  32.             return;
  33.         }
  34.         fprintf(stderr, "Event: zmq_events=%d\n", events);
  35.  
  36.         if (events & ZMQ_POLLIN)
  37.         {
  38.             char buffer[50];
  39.             fprintf(stderr, "Event: ZMQ_POLLIN\n");
  40.            
  41.             if (0 != zmq_recv(sock, buffer,50 ,ZMQ_NOBLOCK))
  42.             {
  43.             fprintf(stderr, "zmq_recv failed\n");
  44.             return;
  45.             }
  46.             fprintf(stderr, "RX: %s", buffer);
  47.            
  48.             sending = true;
  49.             fprintf(stderr, "Received packet, waiting to send response\n");
  50.         }
  51.         if (!sending)   // we have nothing to write
  52.             return;
  53.  
  54.         if (events & ZMQ_POLLOUT)
  55.         {
  56.             //zmq_msg_t msg;
  57.             char *buf = "A reply";
  58.  
  59.             if (0 != zmq_send(sock, buf,7, 0))
  60.             {
  61.             fprintf(stderr, "zmq_send failed\n");
  62.             return;
  63.             }
  64.             fprintf(stderr, "TX: ");
  65.             sending = false;
  66.             fprintf(stderr, "Sent packet, waiting for new request\n");
  67.         }
  68.         }
  69.  
  70.     }
  71.  
  72.     int main(int argc, char *argv[])
  73.     {
  74.          int rc;
  75.          struct ev_loop *loop;
  76.          struct ev_io *watcher;
  77.          int zmq_fd;
  78.          size_t opt_len = sizeof(int);
  79.  
  80.              if (NULL == (watcher = (struct ev_io *)malloc(sizeof(struct ev_io))))
  81.          {
  82.           fprintf(stderr, "out of memory\n");
  83.           return 1;
  84.          }
  85.  
  86.          loop = ev_default_loop(0);
  87.  
  88.          zmq_ctx = zmq_init(1);
  89.  
  90.          sock = zmq_socket(zmq_ctx, ZMQ_REP);
  91.          if (sock == NULL)
  92.          {
  93.           fprintf(stderr, "socket!\n");
  94.           return 0;
  95.          }
  96.  
  97.          rc = zmq_bind(sock, "tcp://*:5555");
  98.          if (rc < 0)
  99.          {
  100.              fprintf(stderr, "bind failed\n");
  101.              return 1;
  102.          }
  103.  
  104.         if (0 != zmq_getsockopt(sock, ZMQ_FD, (void *)&zmq_fd, &opt_len))
  105.         {
  106.           fprintf(stderr, "ZMQ_FD failed\n");
  107.           return 1;
  108.         }
  109.  
  110.         ev_io_init(watcher, watcher_cb, zmq_fd, EV_READ);
  111.         ev_io_start(loop, watcher);
  112.  
  113.         while(1)
  114.         {
  115.         ev_loop(loop, 0);
  116.         }
  117.         return 0;
  118.     }
Advertisement
Add Comment
Please, Sign In to add comment