You can register a customized request handler to extend your server, i.e. mginit, of MiniGUI-Processes.
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);
#define MAX_REQID 0x0030 |
Maximal request identifier.
#define MAX_SYS_REQID 0x0020 |
Maximal system reserved request identifier.
typedef int(* REQ_HANDLER)(int cli, int clifd, void *buff, size_t len) |
int ClientRequest | ( | const REQUEST * | request, | |
void * | result, | |||
int | len_rslt | |||
) | [inline, static] |
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.
This function is a simplified version of ClientRequestEx, i.e. there is no extra data to be sent.
request | The pointer to REQUEST, which contains the data of the request. | |
result | The buffer receives the reply. | |
len_rslt | The lenght of the buffer. |
Definition at line 1124 of file minigui.h.
References ClientRequestEx(), and NULL.
int ClientRequestEx | ( | const REQUEST * | request, | |
const void * | ex_data, | |||
int | ex_data_len, | |||
void * | result, | |||
int | len_rslt | |||
) |
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.
request | The pointer to REQUEST, which contains the data of the request. | |
ex_data | The pointer to extra data to be sent to the server. | |
ex_data_len | The length of the extra data in bytes. | |
result | The buffer receives the reply. | |
len_rslt | The lenght of the buffer. |
Referenced by ClientRequest().
EQ_HANDLER GUIAPI GetRequestHandler | ( | int | req_id | ) |
Gets the request handler by request identifier.
This function returns the request handler of the specified request identifier req_id.
req_id | The request identifier. |
int GUIAPI GetSockFD2Server | ( | void | ) |
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.
BOOL GUIAPI RegisterRequestHandler | ( | int | req_id, | |
REQ_HANDLER | your_handler | |||
) |
Registers a customize request handler.
This function registers a request handler to the server, i.e. mginit.
req_id | The identifier of the customized request. | |
your_handler | The handler of the request. Being NULL to unregister the request handler. |
int GUIAPI ServerSendReply | ( | int | clifd, | |
const void * | reply, | |||
int | len | |||
) |
Sends the reply to the client.
This function sends a replay pointed to by reply which is len bytes long to the client.
clifd | The fd connected to the client. | |
reply | The buffer contains the reply data. | |
len | The length of the reply data in bytes. |