#include #include #include #include #include #include #include #define SERVER "server" #define CLIENT "client" #define DATE "DATE" void fatal(const char *func) { fprintf(stderr, "%s: %s\n", func, nn_strerror(nn_errno())); exit(1); } 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_SURVEYOR)) < 0) { fatal("nn_socket"); } if (nn_bind(sock, url) < 0) { fatal("nn_bind"); } for (;;) { printf("SERVER: SENDING DATE SURVEY REQUEST\n"); int bytes = nn_send(sock, DATE, strlen(DATE) + 1, 0); if (bytes < 0) { fatal("nn_send"); } for (;;) { char *buf = NULL; int bytes = nn_recv(sock, &buf, NN_MSG, 0); if (bytes < 0) { if (nn_errno() == ETIMEDOUT) { break; } fatal("nn_recv"); } printf("SERVER: RECEIVED \"%s\" SURVEY RESPONSE\n", buf); nn_freemsg(buf); } printf("SERVER: SURVEY COMPLETE\n"); sleep(1); // Start another survey in a second } } int client(const char *url, const char *name) { int sock; if ((sock = nn_socket(AF_SP, NN_RESPONDENT)) < 0) { fatal("nn_socket"); } if (nn_connect (sock, url) < 0) { fatal("nn_connect"); } for (;;) { char *buf = NULL; int bytes = nn_recv(sock, &buf, NN_MSG, 0); if (bytes >= 0) { printf("CLIENT (%s): RECEIVED \"%s\" SURVEY REQUEST\n", name, buf); nn_freemsg(buf); char *d = date(); int sz_d = strlen(d) + 1; // '\0' too printf("CLIENT (%s): SENDING DATE SURVEY RESPONSE\n", name); if (nn_send(sock, d, sz_d, 0) < 0) { fatal("nn_send"); } } } } 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: survey %s|%s ...\n", SERVER, CLIENT); return 1; }