コード例 #1
0
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 */
コード例 #2
0
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 */
コード例 #3
0
ファイル: client.c プロジェクト: UltraMessaging/UMExamples
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 */