rpc server rückgabe
-
Hallo,
bin neu hier und hoffe dass ich meine frage an der richtigen stelle poste.
habe folgendes problem:
ich möchte eine rpc client/server anwendung schreiben. der client bekommt über die kommandozeile den server und einen text (string) übergeben, welchen er an den server sendet. auf dem server soll überprüft werden ob es sich um ein palindrom handelt. klappt aber nicht die palindrom überprüfung. zum debuggen habe ich mir mal vom server die länge des übergebenen string zurückgeben lassen und jedes mal kommt 13 vom server zurück. kann mir einer von euch bitte helfenhier mal die entsprechende quellcodes
palindrom_Client.c#include <stdio.h> #include <rpc/rpc.h> #include <string.h> #include "palindrom.h" int main(int argc, char *argv[]) { CLIENT *cl; palindrom_result *r; if(argc!=3) { printf("Korrekter Aufruf : %s <Servername> <Text>\n",argv[0]); exit(1); } cl = clnt_create(argv[1],PALINDROMPROG,PALINDROM_VERSION,"tcp"); if(cl==NULL) { clnt_pcreateerror(argv[1]); exit(2); } printf("Länge : %d\n",strlen(argv[2])); r = palindromfunc_1(&argv[2],cl); printf("Rückgabe Server : %d\n",r->isPalindrom); if(r->isPalindrom==0) { printf("Das eingegebene Wort %s ist ein Palindrom.\n",argv[2]); } else { printf("Das eingegebene Wort %s ist kein Palindrom.\n",argv[2]); } }
palindrom_server.c
#include <stdio.h> #include <rpc/rpc.h> #include <string.h> #include "palindrom.h" int palindrom(char *eingabe) { /*int l = strlen(eingabe) - 1; for(int i=0;i<l/2;i++) { if(eingabe[i]!=eingabe[l-i]) { return 1; } } return 0;*/ return strlen(eingabe); } palindrom_result *palindromfunc_1(char *eingabe) { static palindrom_result ergebnis; ergebnis.isPalindrom = palindrom(eingabe); return &ergebnis; }
-
Du hast nicht den ganzen Sourcecode gepostet, den man braucht um das Beispiel zu kompilieren, und ich bin zu faul mir alles genau anzusehen. Dennoch:
Megara schrieb:
r = palindromfunc_1(&argv[2],cl);
Warum
&argv[2]
? argv2 ist doch schon ein char*, da sollte einfach nurargv[2]
doch reichen.
-
Hallo,
Danke für deine Antwort. Habe deinen Vorschlag versucht aber dann bringt die Ausgabe mir einen Segmentation Dump.palindrom.x
struct palindrom_result { int isPalindrom; int vocalCount; }; program PALINDROMPROG { version PALINDROM_VERSION { palindrom_result PALINDROMFUNC(string) = 1; } = 1; } = 0x000F0000;
Makefile
# Makefile für Palindrom-Beispiel CC = cc LD = -lnsl all: palindrom_Client palindrom_Server # die XDR-Schnittstelle palindrom_clnt.c palindrom_svc.c palindrom.h palindrom_xdr.c: palindrom.x rpcgen palindrom.x # die Server-Prozedur palindrom_Server.o: palindrom_Server.c palindrom.h ${CC} -c palindrom_Server.c -o palindrom_Server.o # der Server-Stub palindrom_svc.o: palindrom_svc.c palindrom.h ${CC} -c palindrom_svc.c -o palindrom_svc.o # der XDR-Filter palindrom_xdr.o: palindrom_xdr.c palindrom.h ${CC} -c palindrom_xdr.c -o palindrom_xdr.o # der Client-Stub palindrom_clnt.o: palindrom_clnt.c palindrom.h ${CC} -c palindrom_clnt.c -o palindrom_clnt.o # das Client-Programm palindrom_Client.o: palindrom_Client.c palindrom.h ${CC} -c palindrom_Client.c -o palindrom_Client.o # der Server palindrom_Server: palindrom_xdr.o palindrom_svc.o palindrom_Server.o ${CC} ${LD} palindrom_xdr.o palindrom_svc.o palindrom_Server.o \ -o palindrom_Server # der Client palindrom_Client: palindrom_Client.o palindrom_xdr.o palindrom_clnt.o ${CC} ${LD} palindrom_Client.o palindrom_xdr.o palindrom_clnt.o \ -o palindrom_Client clean: rm -f palindrom.h palindrom_clnt.* palindrom_svc.* palindrom_xdr.* *.o palindrom_Client palindrom_Server core fresh: clean all
Diese beide Dateien waren vorgegeben von der FH aus.
-
Sorry, aber dein Code kompiliert hier nichtmal. Zeig mal ein kompilierbares Minimalbeispiel, ansonsten ist das hier Zeitverschwendung.
-
Hier ist ein RPC-Tutorial (von 1997; RPC ist nicht so richtig in heutzutage):
http://www.linuxjournal.com/article/2204Und falls du mit Segfaults Schwierigkeiten hast, frag mal den Debugger deines Vertrauens, was los ist.
-
Diesen Artikel hab ich mir mal durchgelesen aber so richtig bei meinem problem konnte der mir nicht helfen.
Minimalbeispiel:
Server: starten mit palindrom_Server
Client: palindrom_Client <Server FH> abba
Server: gibt als übertragenen Text nichts aus (zum Debuggen)
liefert Länge des übertragen strings zurück
Client: Rückgabe Server : 13 (Länge des übertragenen char Array)
-
nman schrieb:
Sorry, aber dein Code kompiliert hier nichtmal. Zeig mal ein kompilierbares Minimalbeispiel, ansonsten ist das hier Zeitverschwendung.
Nochmal: Dein Code laesst sich ohne Aenderungen nicht kompilieren. Man kann ihn also nicht ausprobieren, ohne vorher Kleinmist zu reparieren:
rpcgen palindrom.x cc -c palindrom_Client.c -o palindrom_Client.o palindrom_Client.c: In function ‘main’: palindrom_Client.c:24:3: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘size_t’ [-Wformat] cc -c palindrom_xdr.c -o palindrom_xdr.o cc -c palindrom_clnt.c -o palindrom_clnt.o cc -lnsl palindrom_Client.o palindrom_xdr.o palindrom_clnt.o -o palindrom_Client cc -c palindrom_svc.c -o palindrom_svc.o cc -c palindrom_Server.c -o palindrom_Server.o palindrom_Server.c:20:19: error: conflicting types for ‘palindromfunc_1’ palindrom.h:28:28: note: previous declaration of ‘palindromfunc_1’ was here make: *** [palindrom_Server.o] Error 1
-
Und wenn man diese Fehler repariert, fehlt immer noch die Definition von palindromfunc_1_svc.
-
auf dem server in der fh läuft das aix system. wir wurden drauf aufmerksam gemacht dass es ohne das svc bei palindromfunc_1_svc laufen sollte.
-
Das mag auf dem AIX der Fall sein, aber die Mehrheit der User hier wird kein AIX laufen haben, um mal schnell deinen Code zu testen.