2017-04-03 8 views
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; 
} 

답변

1

, unsigned long long을 reken.x 을 (를) 정의하지 않았습니다. 대신 부호 사용에 unsigned hyper 또는 hyper을 사용하십시오. 자세한 내용은 spec을 참조하십시오.