#include #include #include #include #include #include #include #include #define SERVER "server" #define CLIENT "client" void fatal(const char *func) { fprintf(stderr, "%s: %s\n", func, nn_strerror(nn_errno())); } char * date(void) { time_t now = time(&now); struct tm *info = localtime(&now); char *text = asctime(info); text[strlen(text)-1] = '\0'; // remove '\n' return (text); } int server(const char *url) { int sock; if ((sock = nn_socket(AF_SP, NN_REQ )) < 0) { fatal("nn_socket"); } if (nn_bind(sock, url) < 0) { fatal("nn_bind"); } for (;;) { char *d = date(); int sz_d = strlen(d) + 1; // '\0' too printf("SERVER: PUBLISHING DATE %s\n", d); int bytes = nn_send(sock, d, sz_d, 0); if (bytes < 0) { fatal("nn_send"); } sleep(1); } } int client(const char *url, const char *name) { int sock; if ((sock = nn_socket(AF_SP, NN_REP)) < 0) { fatal("nn_socket"); } // subscribe to everything ("" means all topics) // if (nn_setsockopt(sock, NN_SUB, NN_SUB_SUBSCRIBE, "sjhdfjsdfh", 0) < 0) { // fatal("nn_setsockopt"); // } if (nn_connect(sock, url) < 0) { fatal("nn_connet"); } for (;;) { char *buf = NULL; int bytes = nn_recv(sock, &buf, NN_MSG, 0); if (bytes < 0) { fatal("nn_recv"); } printf("CLIENT (%s): RECEIVED %s\n", name, buf); nn_freemsg(buf); } } int main(const int argc, const char **argv) { if ((argc >= 2) && (strcmp(SERVER, argv[1]) == 0)) return (server(argv[2])); if ((argc >= 3) && (strcmp(CLIENT, argv[1]) == 0)) return (client (argv[2], argv[3])); fprintf(stderr, "Usage: pubsub %s|%s ...\n", SERVER, CLIENT); return 1; }