Here's the overall structure of a server:
#include <sys/neutrino.h> ... void server (void) { int rcvid; // indicates who we should reply to int chid; // the channel ID char message [512]; // big enough for our purposes // create a channel chid = ChannelCreate (0); // this is typical of a server: it runs forever while (1) { // get the message, and print it rcvid = MsgReceive (chid, message, sizeof (message), NULL); printf ("Got a message, rcvid is %X\n", rcvid); printf ("Message was \"%s\".\n", message); // now, prepare the reply. We reuse "message" strcpy (message, "This is the reply"); MsgReply (rcvid, EOK, message, sizeof (message)); } }
As you can see, MsgReceive() tells the kernel that it can handle messages up to sizeof (message) (or 512 bytes). Our sample client (above) sent only 28 bytes (the length of the string). The following diagram illustrates:
The kernel transfers the minimum specified by both sizes. In our case, the kernel would transfer 28 bytes. The server would be unblocked and display the client's message. The remaining 484 bytes (of the 512 byte buffer) will remain unaffected.
We run into the same situation again with MsgReply(). The MsgReply() function says that it wants to transfer 512 bytes, but our client's MsgSend() function has specified that a maximum of 200 bytes can be transferred. So the kernel once again transfers the minimum. In this case, the 200 bytes that the client can accept limits the transfer size. (One interesting aspect here is that once the server transfers the data, if the client doesn't receive all of it, as in our example, there's no way to get the data backāit's gone forever.)
When we discuss message passing over a network, you'll see that there's a tiny gotcha with the amount of data transferred. We'll see this in Networked message-passing differences, below.