main() { lbm_context_t *ctx; /* Context object */ lbm_context_attr_t * cattr; /* Context attribute object */ lbm_rcv_t *rcv; /* Receive object: for subscribing to messages. */ lbm_topic_t *rtopic; /* Receiver Topic object */ lbm_rcv_topic_attr_t * rattr; /* Receiver attribute object */ lbm_ume_rcv_recovery_info_ex_func_t cb; /* Sequence number info callback function */ int err; /* Used for checking API return codes */ #if defined(_WIN32) /* windows-specific code */ WSADATA wsadata; int wsStat = WSAStartup(MAKEWORD(2,2), &wsadata); if (wsStat != 0) { printf("line %d: wsStat=%d\n",__LINE__,wsStat); exit(1); } #endif /* Initialize context atrributes and create context */ err = lbm_context_create(&ctx, NULL, NULL, NULL); EX_LBM_CHK(err); /* Create receiver for receiving request and sending response */ err = lbm_rcv_topic_attr_create(&rattr); EX_LBM_CHK(err); cb.func = ume_rcv_seqnum_ex; cb.clientd = NULL; err = lbm_rcv_topic_attr_setopt(rattr, "ume_recovery_sequence_number_info_function", &cb, sizeof(cb)); EX_LBM_CHK(err); err = lbm_rcv_topic_lookup(&rtopic, ctx, "test.topic", rattr); EX_LBM_CHK(err); err = lbm_rcv_create(&rcv, ctx, rtopic, rcv_handle_msg, NULL, NULL); EX_LBM_CHK(err); while (1) { } err = lbm_rcv_delete(rcv); EX_LBM_CHK(err); err = lbm_context_delete(ctx); EX_LBM_CHK(err); #if defined(_MSC_VER) /* Windows-specific cleanup overhead */ WSACleanup(); #endif } /* main */
int main(int argc, char **argv) { lbm_context_t *ctx; /* Context object */ lbm_rcv_t *rcv; /* Receive object: for subscribing to messages. */ lbm_topic_t *rtopic; /* Receiver Topic object */ int err; #if defined(_WIN32) /* windows-specific code */ WSADATA wsadata; int wsStat = WSAStartup(MAKEWORD(2,2), &wsadata); if (wsStat != 0) { printf("line %d: wsStat=%d\n",__LINE__,wsStat); exit(1); } #endif /* Initialize context atrributes and create context */ err = lbm_context_create(&ctx, NULL, NULL, NULL); EX_LBM_CHK(err); /* Create receiver for receiving request and sending response */ err = lbm_rcv_topic_lookup(&rtopic, ctx, "test.topic", NULL); EX_LBM_CHK(err); err = lbm_rcv_create(&rcv, ctx, rtopic, rcv_handle_msg, NULL, NULL); EX_LBM_CHK(err); /* Wait forever (or until control-c). */ while (1) { } err = lbm_rcv_delete(rcv); EX_LBM_CHK(err); err = lbm_context_delete(ctx); EX_LBM_CHK(err); #if defined(_MSC_VER) /* Windows-specific cleanup overhead */ WSACleanup(); #endif return 0; } /* main */
int main(int argc, char **argv) { lbm_context_t *ctx; server_t server; /* State information for the server. */ char response_topic_name[256]; int err; /* Get (pretty much) unique client name. */ sprintf(response_topic_name, "Client.%lx.Response", (long)getpid()); #if defined(_MSC_VER) /* windows-specific code */ WSADATA wsadata; int wsStat = WSAStartup(MAKEWORD(2,2), &wsadata); if (wsStat != 0) { printf("line %d: wsStat=%d\n",__LINE__,wsStat); exit(1); } #endif server.ctx = NULL; server.topic_name = "Server1.Request"; server.src = NULL; /* Source to send requests to server. */ server.rcv = NULL; /* Receiver for responses from server. */ server.state = 0; /* Waiting for registration. */ err = lbm_config("client.cfg"); EX_LBM_CHK(err); err = lbm_context_create(&ctx, NULL, NULL, NULL); EX_LBM_CHK(err); server.ctx = ctx; /* Create source to send requests to server. */ { lbm_topic_t *topic; err = lbm_src_topic_alloc(&topic, ctx, server.topic_name, NULL); EX_LBM_CHK(err); err = lbm_src_create(&server.src, ctx, topic, NULL, NULL, NULL); EX_LBM_CHK(err); } /* Create receiver for responses from server. */ { lbm_topic_t *topic; err = lbm_rcv_topic_lookup(&topic, ctx, response_topic_name, NULL); EX_LBM_CHK(err); err = lbm_rcv_create(&server.rcv, ctx, topic, response_rcv_cb, &server, NULL); EX_LBM_CHK(err); } /* Register with the server. May need multiple tries. */ { int try_cnt = 0; int backoff_delay; char register_msg[257]; sprintf(register_msg, "r%s", response_topic_name); backoff_delay = 1; /* In milliseconds. */ MSLEEP(backoff_delay); /* Let TR complete. */ while (server.state == 0) { try_cnt ++; err = lbm_src_send(server.src, register_msg, strlen(register_msg) + 1, LBM_MSG_FLUSH | LBM_SRC_BLOCK); EX_LBM_CHK(err); printf("Sent '%s' to %s\n", register_msg, server.topic_name); /* Exponential backoff, to max of 1 sec. */ backoff_delay *= 2; /* Exponential backoff to max of 1 sec. */ if (backoff_delay > 1000) { backoff_delay = 1000; } MSLEEP(backoff_delay); /* Wait for server response. */ } printf("Took %d tries to register with server.\n", try_cnt); } /* Main work of the program, which includes sending 5 requests. */ { int i; char send_buf[500]; req_hdr_t *req_hdr = (req_hdr_t *)send_buf; memset((char *)req_hdr, '0', sizeof(req_hdr_t)); req_hdr->data[0] = 'R'; for (i = 0; i < 5; i++) { /* The application builds a request into <tt>request_msg</tt>. */ char request_msg[257]; sprintf(request_msg, "%s.%d", response_topic_name, i); /* The application message is copied in after the header. */ strcpy(&send_buf[sizeof(req_hdr_t)], request_msg); err = lbm_src_send(server.src, send_buf, strlen(send_buf) + 1, LBM_MSG_FLUSH | LBM_SRC_NONBLOCK); EX_LBM_CHK(err); MSLEEP(1000); } } printf("Client exiting.\n"); err = lbm_rcv_delete(server.rcv); EX_LBM_CHK(err); err = lbm_src_delete(server.src); EX_LBM_CHK(err); err = lbm_context_delete(ctx); EX_LBM_CHK(err); #if defined(_MSC_VER) WSACleanup(); #endif return 0; } /* main */