The client is much simpler:
/* * Message Client Process */ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <errno.h> #include <string.h> #include <sys/neutrino.h> #include <sys/iofunc.h> #include <sys/dispatch.h> typedef struct { uint16_t msg_no; char msg_data[255]; } client_msg_t; int main( int argc, char **argv ) { int fd; int c; client_msg_t msg; int ret; int num; char msg_reply[255]; num = 1; /* Process any command line arguments */ while( ( c = getopt( argc, argv, "n:" ) ) != -1 ) { if( c == 'n' ) { num = strtol( optarg, 0, 0 ); } } /* Open a connection to the server (fd == coid) */ fd = open( "serv", O_RDWR ); if( fd == -1 ) { fprintf( stderr, "Unable to open server connection: %s\n", strerror( errno ) ); return EXIT_FAILURE; } /* Clear the memory for the msg and the reply */ memset( &msg, 0, sizeof( msg ) ); memset( &msg_reply, 0, sizeof( msg_reply ) ); /* Set up the message data to send to the server */ msg.msg_no = _IO_MAX + num; snprintf( msg.msg_data, 254, "client %d requesting reply.", getpid() ); printf( "client: msg_no: _IO_MAX + %d\n", num ); fflush( stdout ); /* Send the data to the server and get a reply */ ret = MsgSend( fd, &msg, sizeof( msg ), msg_reply, 255 ); if( ret == -1 ) { fprintf( stderr, "Unable to MsgSend() to server: %s\n", strerror( errno ) ); return EXIT_FAILURE; } /* Print out the reply data */ printf( "client: server replied: %s\n", msg_reply ); close( fd ); return EXIT_SUCCESS; }
The client uses the open() function to get a coid (the server's default resmgr setup takes care of all of this on the server side), and performs a MsgSend() to the server based on this coid, and then waits for the reply. When the reply comes back, the client prints the reply data.
You can give the client the command-line option -n# (where # is the offset from _IO_MAX) to use for the message. If you give anything over 2 as the offset, the MsgSend() will fail, since the server hasn't set up handlers for those messages.
This example is very basic, but it still covers a lot of ground. There are many other things you can do using this same basic framework:
Many of these topics are covered later in this guide.