2017-04-03 27 views
0

我有一个文件reken.x,client.c和server.c来创建一个分布式系统。客户端将两个素数(如此一个数字)的乘积发送到服务器上的“ontbind”函数,该函数将数字分解为两个素数。当我在“reken_in”和“reken_uit”结构中声明变量“getal1”,“antwoord1”和“antwoord2”作为整数时,这可以正常工作。然而,当我使用unsigned long类型多头出现以下错误:使用无符号长整型与rpcgen给出错误

[email protected]:~/Desktop/tarbal$ rpcgen reken.x 
unsigned long long getal1; 
^^^^^^^^^^^^^^^^^^^ 
reken.x, line 2: expected '*' or 'identifier' 

我如何与无符号long long类型这项工作?请参阅下面的我的代码。

reken.x

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

#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

在XDR,unsigned long long没有定义,而是使用: unsigned hyperhyper进行签名。有关更多详细信息,请参阅spec

相关问题