ONC+ Developer's Guide

Using a simple counter with non-blocking I/O

The client.c file in the one-way messaging example is modified in this section to demonstrate how to use the non-blocking I/O mode. In this new file, client_nonblo.c, the I/O mode is specified as non-blocking with the RPC_CL_NONBLOCKING argument, the flush mode is chosen to be blocking by use of the RPC_CL_BLOCKING_FLUSH. The I/O mode and flush mode are invoked with CLSET_IO_MODE. When an error occurs RPC_CANT_STORE is returned to the client and the program tries to flush the buffer. To choose a different method of flush consult the clnt_control(3NSL) man page.

#include <stdio.h>
#include "counter.h"
main(int argc, char *argv[])
{
 CLIENT* clnt;
 enum clnt_stat result;
 char *server;
 int number;
 bool_t bres;
		/* 
		 * Choose the I/O mode and flush method to be used.
		 * The non-blocking I/O mode and blocking flush are 
		 * chosen in this example.
		 */
 int mode = RPC_CL_NONBLOCKING;
 int flushMode = RPC_CL_BLOCKING_FLUSH;
 if (argc != 3) {
			 fprintf(stderr, "usage: %s server_name number\n", argv[0]);
			 exit(1);
 }
 server = argv[1];
 number = atoi(argv[2]);
 clnt= clnt_create(server, COUNTERPROG, COUNTERVERS, "tcp");
 if (clnt == (CLIENT*) NULL) {
			 clnt_pcreateerror(server);
			 exit(1);
 }
		/* 
 	 * Use clnt_control to set the I/O mode. 
 	 * The non-blocking I/O mode is 
 	 * chosen for this example.
 	 */
 bres = clnt_control(clnt, CLSET_IO_MODE, (char*)&mode);
 if (bres)
	 /* 
		 * Set flush mode to blocking 
		 */
 bres = clnt_control(clnt, CLSET_FLUSH_MODE, (char*)&flushMode);
 if (!bres) {
 clnt_perror(clnt, "clnt_control");
 exit(1);
 }
		 /* 
 	 * Call the RPC services.
 	 */
 result = add_1(number, clnt);
 switch (result) {
 case RPC_SUCCESS:
 fprintf(stdout,"Success\n");
 break;
		/*
 	 * RPC_CANTSTORE is a new value returned to the 
		 * client when the buffer cannot store a request.
		 */
 case RPC_CANTSTORE:
 fprintf(stdout,"RPC_CANTSTORE error. Flushing ... \n");
		/*
		 * The buffer is flushed using the blocking flush method
		 */
			 bres = clnt_control(clnt, CLFLUSH, NULL);
 if (!bres) {
	 		 clnt_perror(clnt, "clnt_control");
			 }
 break;
 default:
			 clnt_perror(clnt, "call failed");
 break;
 }
 /* Flush */
 bres = clnt_control(clnt, CLFLUSH, NULL);
 if (!bres) {
			 clnt_perror(clnt, "clnt_control");
 }
 clnt_destroy(clnt);
 exit(0);
}
  • © 2010, Oracle Corporation and/or its affiliates

AltStyle によって変換されたページ (->オリジナル) /