RPC Problem
-
Nicht lachen, erste Schritte in RPC.
Was stimmt damit nicht?
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <rpc/rpc.h> #include <rpc/pmap_clnt.h> #include <rpcsvc/rusers.h> [...] int arg, test_rusers = 0, test_rup = 0, nusers; CLIENT *rusers_clnt; struct utmpidlearr *up; struct timeval timeout = { 5, 0 }; [...] rusers_clnt = clnt_create(argv[2], RUSERSPROG, RUSERSVERS_IDLE, "udp"); if (rusers_clnt == NULL) { clnt_pcreateerror(argv[0]); exit(EXIT_FAILURE); } memset(&up, 0, sizeof(up)); clnt_call( rusers_clnt, RUSERSPROC_NAMES, xdr_void, NULL, xdr_utmpidlearr, &up, timeout); for (nusers = 0; nusers < up->uia_cnt; nusers++) { char *name = malloc(sizeof(char)*1000); strncpy(name, up->uia_arr[nusers]->ui_utmp.ut_name, 1000); printf("%s\n", name); } /* callrpc(argv[2], RUSERSPROG, RUSERSVERS_IDLE, RUSERSPROC_NAMES, (xdrproc_t)xdr_void,(char*)NULL,xdr_utmpidlearr, (char*)up); for (nusers = 0; nusers < up->uia_cnt; nusers++) { char *name; strcpy(name, up->uia_arr[nusers]->ui_utmp.ut_name); printf("%s\n", name); } */ /* printf() the usernames to stdout */ // clnt_destroy(rusers_clnt); exit ( EXIT_SUCCESS ); }
Hab schon so gut wie alle möglichen Variationen durchgespielt.
Kann mir mal einer Bitte behilflich sein?
Fehler:Ich bekomme eine SIGSEGV.
ltrace(1) darauf ergibt das:
[...]
malloc(1000) = 0x0804f2c8
strncpy(0x0804f2c8, "EOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOF"..., 1000 <unfinished ...>
--- SIGSEGV (Segmentation fault) ---
+++ killed by SIGSEGV +++gdb:
Program received signal SIGSEGV, Segmentation fault.
0x400a6d20 in strncpy () from /lib/libc.so.6
(gdb) where
#0 0x400a6d20 in strncpy () from /lib/libc.so.6
#1 0x0804885e in main (argc=3, argv=0xbffff4a4) at rpc_test.c:75
#2 0x400408ae in __libc_start_main () from /lib/libc.so.6Nachtrag: Ich bekomme immer einen Fehler, wenn ich auf
up->uia_arr[nusers]->ui_utmp.ut_name zugreifen will.
Wird das Element nicht richtig gefüllt? Ist das ein C Problem oder doch RPC?
-
patrick++ schrieb:
for (nusers = 0; nusers < up->uia_cnt; nusers++) { char *name = malloc(sizeof(char)*1000); strncpy(name, up->uia_arr[nusers]->ui_utmp.ut_name, 1000); printf("%s\n", name); }
1. Du reservierst Speicher mit malloc (warum auch immer) und gibst ihn nie frei
2. 'name' ist eventuell garnicht 0-Terminiert.
Mach aus der malloc-Zeile also besser:char name[1001] = {0};
Weiß nicht, wieso es abstürzt.. Sicher dass 'up' keinen Speicher brauch? (Der memset-Aufruf ist jedenfalls schonmal falsch).
-
Hi.
Hmmmm jetzt gehts. Lag aber nicht an deinen Tips, Doc
Leider.clnt_call( rusers_clnt, RUSERSPROC_NAMES, (xdrproc_t)xdr_void, NULL, (xdrproc_t)xdr_utmpidlearr, &up, timeout);
So muss das aussehen.
Dann klappts auch mit der structTrotzdem danke
-
patrick++ schrieb:
Lag aber nicht an deinen Tips
Nichtsdestotrotz solltest du dich ihren annehmen