A request consists of an identifier and the data associated with the request. The identifier is used by MiniGUI to determine which handler should be called when a request arrives. When MiniGUI finds one handler, it will call the handler and pass the socket fd connected to the client, the data associated with the request, and the length of the data. Eventually, the handler will sent the reply to the client.
After register a customized request handler in your server, you can call ClientRequest function in the client to send a request to the server and wait for the reply. On the other hand, the request handler in the server will receive the request and call ServerSendReply to send the reply to the client. In this way, you can create a simple IPC (inter-process conmmunication) mechanism between clients and the server.
Example:
typedef struct TEST_REQ { int a, b; } TEST_REQ; /* * In the server, we define the request handler * and register it. */ static int ServerSendReply (int clifd, void* reply, int len) { MSG reply_msg = {HWND_INVALID, 0}; /* * Sending a null message to client in order to indicate this is * a reply of a request. */ if (sock_write (clifd, &reply_msg, sizeof (MSG)) < 0) return SOCKERR_IO; /* Send the result to the client. */ if (sock_write (clifd, reply, len) < 0) return SOCKERR_IO; return SOCKERR_OK; } /* * This handler adds two integers and returns the sum * to the client. */ static int test_request (int cli, int clifd, void* buff, size_t len) { int ret_value = 0; TEST_REQ* test_req = (TEST_REQ*)buff; ret_value = test_req.a + test_req.b; return ServerSendReply (clifd, &ret_value, sizeof (int)); } ... RegisterRequestHandler (MAX_SYS_REQID + 1, test_request); ... /* * In the client, we can send a request to the server * to get the sum of two integers. */ REQUEST req; TEST_REQ test_req = {5, 10}; int ret_value; req.id = MAX_SYS_REQID + 1; req.data = &rest_req; req.len_data = sizeof (TEST_REQ); ClientRequest (&req, &ret_value, sizeof (int)); /* ret_value shoudl be 15. */ printf ("the returned value: %d\n", ret_value);
|
|
Maximal request identifier.
|
|
|
Maximal system reserved request identifier.
|
|
|
Data type of pointer to a REQUEST |
|
|
Request handler.
|
|
|
A request will be sent to the server of MiniGUI-Processes. |
|
||||||||||||||||
|
Sends a request to the server and wait reply. If result is NULL or len_rslt is zero, the function will return immediately after sent the data to the server.
|
|
|
Gets the request handler by request identifier. This function returns the request handler of the specified request identifier req_id.
|
|
|
Gets the file descriptor of the socket connected to the server. This function returns the file descriptor of the socket connected to the server, i.e. mginit.
|
|
||||||||||||
|
Registers a customize request handler. This function registers a request handler to the server, i.e. mginit.
|
|
||||||||||||||||
|
Sends the reply to the client. This function sends a replay pointed to by reply which is len bytes long to the client.
|
1.4.2