Writing the RPC Server using XDRCreate "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 |