zhelpers.h

Go to the documentation of this file.
00001 /*  =====================================================================
00002     zhelpers.h
00003 
00004     Helper header file for example applications.
00005     =====================================================================
00006 */
00007 
00008 #ifndef __ZHELPERS_H_INCLUDED__
00009 #define __ZHELPERS_H_INCLUDED__
00010 
00011 //  Include a bunch of headers that we will need in the examples
00012 
00013 #include <zmq.h>
00014 
00015 #include <stdint.h>
00016 #include <stdio.h>
00017 #include <stdlib.h>
00018 #include <stdarg.h>
00019 #include <string.h>
00020 
00021 #if (defined (WIN32))
00022 #   include <time.h>
00023 #else
00024 #   include <sys/time.h>
00025 #endif
00026 
00027 #include <assert.h>
00028 #include <signal.h>
00029 
00030 //  Version checking, and patch up missing constants to match 2.1
00031 #if ZMQ_VERSION_MAJOR == 2
00032 #   error "Please upgrade to ZeroMQ/3.2 for these examples"
00033 #endif
00034 
00035 //  Provide random number from 0..(num-1)
00036 #if (defined (WIN32))
00037 #   define randof(num)  (int) ((float) (num) * rand () / (RAND_MAX + 1.0))
00038 #else
00039 #   define randof(num)  (int) ((float) (num) * random () / (RAND_MAX + 1.0))
00040 #endif
00041 
00042 
00043 //  Receive 0MQ string from socket and convert into C string
00044 //  Caller must free returned string. Returns NULL if the context
00045 //  is being terminated.
00046 static char *
00047 s_recv (void *socket) {
00048     char buffer [256];
00049     int size = zmq_recv (socket, buffer, 255, 0); //ZMQ_DONTWAIT);
00050     if (size == -1)
00051         return NULL;
00052     if (size > 255)
00053         size = 255;
00054     buffer [size] = 0;
00055     return strdup (buffer);
00056 }
00057 
00058 //  Convert C string to 0MQ string and send to socket
00059 static int
00060 s_send (void *socket, char *string) {
00061     int size = zmq_send (socket, string, strlen (string), 0);
00062     return size;
00063 }
00064 
00065 //  Sends string as 0MQ string, as multipart non-terminal
00066 static int
00067 s_sendmore (void *socket, char *string) {
00068     int size = zmq_send (socket, string, strlen (string), ZMQ_SNDMORE);
00069     return size;
00070 }
00071 
00072 //  Receives all message parts from socket, prints neatly
00073 //
00074 static void
00075 s_dump (void *socket)
00076 {
00077     puts ("----------------------------------------");
00078     while (1) {
00079         //  Process all parts of the message
00080         zmq_msg_t message;
00081         zmq_msg_init (&message);
00082         int size = zmq_msg_recv (&message, socket, 0);
00083 
00084         //  Dump the message as text or binary
00085         char *data = (char*)zmq_msg_data (&message);
00086         int is_text = 1;
00087         int char_nbr;
00088         for (char_nbr = 0; char_nbr < size; char_nbr++)
00089             if ((unsigned char) data [char_nbr] < 32
00090             ||  (unsigned char) data [char_nbr] > 127)
00091                 is_text = 0;
00092 
00093         printf ("[%03d] ", size);
00094         for (char_nbr = 0; char_nbr < size; char_nbr++) {
00095             if (is_text)
00096                 printf ("%c", data [char_nbr]);
00097             else
00098                 printf ("%02X", (unsigned char) data [char_nbr]);
00099         }
00100         printf ("\n");
00101 
00102         int64_t more;           //  Multipart detection
00103         more = 0;
00104         size_t more_size = sizeof (more);
00105         zmq_getsockopt (socket, ZMQ_RCVMORE, &more, &more_size);
00106         zmq_msg_close (&message);
00107         if (!more)
00108             break;      //  Last message part
00109     }
00110 }
00111 
00112 //  Set simple random printable identity on socket
00113 //
00114 static void
00115 s_set_id (void *socket)
00116 {
00117     char identity [10];
00118     sprintf (identity, "%04X-%04X", randof (0x10000), randof (0x10000));
00119     zmq_setsockopt (socket, ZMQ_IDENTITY, identity, strlen (identity));
00120 }
00121 
00122 /*
00123 //  Sleep for a number of milliseconds
00124 static void
00125 s_sleep (int msecs)
00126 {
00127 #if (defined (WIN32))
00128     Sleep (msecs);
00129 #else
00130     struct timespec t;
00131     t.tv_sec  =  msecs / 1000;
00132     t.tv_nsec = (msecs % 1000) * 1000000;
00133     nanosleep (&t, NULL);
00134 #endif
00135 }
00136 */
00137 
00138 //  Return current system clock as milliseconds
00139 static int64_t
00140 s_clock (void)
00141 {
00142 #if (defined (WIN32))
00143     SYSTEMTIME st;
00144     GetSystemTime (&st);
00145     return (int64_t) st.wSecond * 1000 + st.wMilliseconds;
00146 #else
00147     struct timeval tv;
00148     gettimeofday (&tv, NULL);
00149     return (int64_t) (tv.tv_sec * 1000 + tv.tv_usec / 1000);
00150 #endif
00151 }
00152 
00153 //  Print formatted string to stdout, prefixed by date/time and
00154 //  terminated with a newline.
00155 
00156 /*
00157 static void
00158 s_console (const char *format, ...)
00159 {
00160     time_t curtime = time (NULL);
00161     struct tm *loctime = localtime (&curtime);
00162     char *formatted = (char*)malloc (20);
00163     strftime (formatted, 20, "%y-%m-%d %H:%M:%S ", loctime);
00164     printf ("%s", formatted);
00165     free (formatted);
00166 
00167     va_list argptr;
00168     va_start (argptr, format);
00169     vprintf (format, argptr);
00170     va_end (argptr);
00171     printf ("\n");
00172 }
00173 */
00174 #endif  //  __ZHELPERS_H_INCLUDED__

Generated on 28 May 2018 for CAFE by  doxygen 1.6.1