|
|
||||
|
|
II. Writing the ServerCreate "llist_svc_proc.c" to hold the server code. I #included llist.h, copied over the prototypes, and implemented the server as follows:int result;
/* print out a list, returning the number of items printed */
int *print_list_1_svc(list *lst, struct svc_req *req)
{
list *ptr;
ptr = lst;
result = 0;
while (ptr != NULL) {
printf("{%s, ", ptr->data);
printf("%d, ", ptr->key);
switch (ptr->col) {
case ORANGE: printf("orange"); break;
case PUCE: printf("puce"); break;
case TURQUOISE: printf("turquoise");
}
printf("}\n");
result++;
ptr = ptr->next;
}
return &result;
}
int *sum_list_1_svc(list *lst, struct svc_req *req)
{
list *ptr;
ptr = lst;
result = 0;
while (ptr != NULL) {
result += ptr->key;
ptr = ptr->next;
}
return &result;
}
Note the quirky return values: rpcgen asked us to write functions that return
pointers to their integer results, not the integers themselves. To
comply, I had to create a global variable. Note that this pointer, "&result",
is not getting sent over the network; it is merely being passed to some XDR
function in our address space to be dealt with. If you'd like to peek at
the mechanism that controls this process, read llist_svc.c. You might be
disappointed; most of what goes on is actually handled by lower-level RPC
library routines such as "svc_getargs()" and "svc_sendreply()".
Next: Writing the client and Putting it all together ----- |
|
||