0
reken.x, client.c 및 server.c 파일을 가지고 분산 시스템을 만듭니다. 클라이언트는 서버의 "ontbind"함수에 두 개의 소수 (즉 하나의 숫자)의 곱을 전송하여 두 개의 소수로 다시 나눕니다. 변수 "getal1", "antwoord1"및 "antwoord2"를 "reken_in"및 "reken_uit"구조체로 int로 선언하면 올바르게 작동합니다. 그러나 부호없는 long long을 사용할 때 다음과 같은 오류가 발생합니다.rpcgen에서 부호없는 long long을 사용하면 오류가 발생합니다.
[email protected]:~/Desktop/tarbal$ rpcgen reken.x
unsigned long long getal1;
^^^^^^^^^^^^^^^^^^^
reken.x, line 2: expected '*' or 'identifier'
부호없는 long long 형식으로이 작업을 수행하려면 어떻게해야합니까? 아래 내 코드를 참조하십시오.
는
struct reken_in { /*input argument*/
unsigned long long getal1;
};
struct reken_uit {
unsigned long long antwoord1;
unsigned long long antwoord2;
};
program BEREKEN {
version BERVERS{
reken_uit ONTBIND(reken_in) =1; /*procedure nr. 1*/
}=1;
}=0x31230000; /*programma nummer*/
client.c
#include <stdio.h>
#include <rpc/rpc.h>
#include "reken.h"
#include <stdlib.h>
main(int argc,char *argv[])
{
//hi
CLIENT *cl;
char *server;
reken_in getallen;
reken_uit *antw;
if(argc !=3) {
puts("aantal argumenten niet goed <server productPriemen>");
exit(1);
}
server=argv[1];
getallen.getal1= strtoull(argv[2], NULL, 10);
cl=clnt_create(server,BEREKEN,BERVERS,"tcp");
if(cl==NULL) {
printf("fout bij het zoeken naar de server");
clnt_pcreateerror(server);
exit(1);
}
antw= ontbind_1(&getallen,cl);
if(antw==NULL)
puts("fout bij teruggeef parameter");
printf("Het getal %llu is het product van priemgetal %llu en %llu\n",getallen.getal1, antw->antwoord1, antw->antwoord2);
exit (0);
}
server.c XDR에서
#include <stdio.h>
#include <rpc/rpc.h>
#include <dirent.h>
#include "reken.h"
#include <math.h>
reken_uit *ontbind_1_svc(struct reken_in *g,struct svc_req *reg)
{
static reken_uit getallen;
unsigned long long number = g->getal1;
unsigned long long i;
unsigned long long fact;
for(i = 2; i <= sqrt(number); i++) { //loop tot de sqrt
if (!isPrime(i) || (i % 2 == 0 && i != 2)) continue;
if (number % i != 0) continue;
fact = number/i; //deel door de i. De i is een prime
int prime = isPrime(fact);
if (!prime) continue;
getallen.antwoord1 = i;
getallen.antwoord2 = fact;
return (&getallen);
}
return (&getallen);
}
int isPrime (const long long number) {
int i;
for(i = 2; i < number/2; i++) { // 7
if ((number % i) == 0) // 7 % 2 == 1
return 0;
}
return 1;
}