#include "bipc.h" #define NODE0 "node0" #define NODE1 "node1" static void fatal(const char *func, int rv) { fprintf(stderr, "%s: %s\n", func, bipc_strerror(rv)); exit(1); } int send_name(bipc_socket_t sock, const char *name) { int rv; printf("%s: SENDING \"%s\"\n", name, name); if ((rv = bipc_send(&sock, name, strlen(name) + 1)) != 0) { fatal("bipc_send", rv); } return (rv); } int recv_name(bipc_socket_t sock, const char *name) { char *buf = NULL; int rv; size_t sz; if ((rv = bipc_recv(&sock, &buf, &sz)) == 0) { printf("%s: RECEIVED \"%s\"\n", name, buf); nng_free(buf, sz); } return (rv); } int send_recv(bipc_socket_t sock, const char *name) { int rv; int timeout = 100; // if ((rv = nng_setopt_ms(sock, NNG_OPT_RECVTIMEO, 100)) != 0) { if ((rv = bipc_setopt(&sock, BIPC_OPT_RECVTIMEO, &timeout, sizeof(int))) != 0) { fatal("nng_setopt_ms", rv); } for (;;) { recv_name(sock, name); sleep(1); send_name(sock, name); } } int node0(const char *url) { bipc_socket_t sock; int rv; // if ((rv = nng_pair0_open(&sock)) != 0) { // fatal("nng_pair0_open", rv); // } if ((rv = bipc_listen(&sock, url, PAIR)) !=0) { fatal("nng_listen", rv); } return (send_recv(sock, NODE0)); } int node1(const char *url) { bipc_socket_t sock; int rv; sleep(1); // if ((rv = nng_pair0_open(&sock)) != 0) { // fatal("nng_pair0_open", rv); // } if ((rv = bipc_connect(&sock, url, PAIR)) != 0) { fatal("nng_dial", rv); } return (send_recv(sock, NODE1)); } int main(int argc, char **argv) { if ((argc > 1) && (strcmp(NODE0, argv[1]) == 0)) return (node0(argv[2])); if ((argc > 1) && (strcmp(NODE1, argv[1]) == 0)) return (node1(argv[2])); fprintf(stderr, "Usage: pair %s|%s ...\n", NODE0, NODE1); return 1; }