Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/11/2006, à 17:50

shensi

[RESOLU] Requête rpc: Programme en C : d'où vient l'erreur?

Salut à tous !

Je suis en train de tester un programme Client/serveur en C utilisant les librairies :


#include<rpc/types.h>
#include<rpc/xdr.h>

voila ca que me dit ma ubuntu 6.10 lorsque j'exécute mon programme:

root@shadow:/mnt/data/cours/sr/tp1_rpc_complexe# ls
client  client.c  client.c~  head.c  head.h  serveur  serveur.c
root@shadow:/mnt/data/cours/sr/tp1_rpc_complexe# cc serveur.c head.c -o serveur
serveur.c: In function ‘Mul’:
serveur.c:37: warning: return from incompatible pointer type
head.c: In function ‘xdr_couple’:
head.c:13: warning: passing argument 2 of ‘xdr_float’ from incompatible pointer type
head.c:13: warning: passing argument 2 of ‘xdr_float’ from incompatible pointer type
root@shadow:/mnt/data/cours/sr/tp1_rpc_complexe# ./serveur
Cannot register service: RPC: Unable to receive; errno = Connection refused
couldn't register prog 1 vers 1

Alors ??
Merci d'avance

Dernière modification par shensi (Le 28/11/2006, à 03:24)


Distrib: Ubuntu 9.04
Citation : Si chuck Norris te dit que ta mère est bonne... tu peux l'appeler Papa

Hors ligne

#2 Le 26/11/2006, à 23:04

shensi

Re : [RESOLU] Requête rpc: Programme en C : d'où vient l'erreur?

je crois qu'en vous montrant mon code vous comprendrez mieux ...

// head.h

#include<rpc/types.h>
#include<rpc/xdr.h>

#define PROG 1
#define VERSION 1

typedef struct chaine{
	char *ch1;
	char *ch2;
}chaine;

int xdr_chaine(XDR *xdrp, chaine *c);

// head.c

#include "head.h"


int xdr_chaine(XDR *xdrp, chaine *c){
	
	return( xdr_wrapstring(xdrp, &c->ch1) && xdr_wrapstring(xdrp, &c->ch2) );
}

// serveur.c

#include "head.h"
#include <string.h>

int *Longueur(chaine *data){

	static int res;
	res = strlen(data->ch1);
	
	return (&res);
}


char **Concatenation(chaine *data){

	static char *chaine;
	chaine = (char*)malloc (sizeof(char)* strlen(data->ch1)+strlen(data->ch2) );

	strcpy(chaine, data->ch1);
	strcpy(chaine, data->ch2);

	return (&chaine);
}


main(){
	registerrpc(1, 1, 1, Longueur, xdr_chaine, xdr_int);
	registerrpc(1, 1, 2, Concatenation, xdr_chaine, xdr_string);
	svc_run();
}

// client.c

#include "head.h"

#include <stdio.h>
#include <string.h>

void usage (char *name){
	printf("Programme client/serveur --> Traitement sur des chaines de caractères\n");
	printf("usage: %s <chaine> <chaine>\n", name);
}

int main(int argc, char **argv){

	if(argc =! 2){
		usage(argv[0]);
		return 1;
	}

	chaine data;
	int longueur;
	char *chaine;

	strcpy(data.ch1, argv[1]);
	strcpy(data.ch2, argv[2]);

	// Pour la concaténation on doit à priori faire un malloc avant d'envoyer les 2 chaines à concaténer
	chaine = (char*)malloc(sizeof(char)* (strlen(data.ch1)+strlen(data.ch2)+1) );

	// Appel de la fonction sur la longueur d'une chaine
	callrpc("localhost",PROG, VERSION, 1, xdr_chaine, &data, xdr_int, &longueur);

	// Appel de la fonction sur la concaténation de 2 chaines
	callrpc("localhost",PROG, VERSION, 2, xdr_chaine, &data, xdr_wrapstring, &chaine);

	// Affichage
	printf("La longueur de la chaine est : %d ", &longueur);
	printf("La concaténation des 2 chaines donne : %s ", &chaine);

	return 0;
}

// Voici la phase de compilation du client ce que je comprends pas trop...:

...$ cc client.c head.c -o client
...$ ./client
Erreur de segmentation (core dumped)

// Voici la phase de compilation du serveur ce que je comprends encore moins...:

...$ cc serveur.c head.c -o serveur
...$ ./serveur
Cannot register service: RPC: Unable to receive; errno = Connection refused
couldn't register prog 1 vers 1
Cannot register service: RPC: Unable to receive; errno = Connection refused
couldn't register prog 1 vers 1

Dernière modification par shensi (Le 26/11/2006, à 23:08)


Distrib: Ubuntu 9.04
Citation : Si chuck Norris te dit que ta mère est bonne... tu peux l'appeler Papa

Hors ligne

#3 Le 28/11/2006, à 03:24

shensi

Re : [RESOLU] Requête rpc: Programme en C : d'où vient l'erreur?

Bon pour info j'ai trouvé et je poste quand même la réponse

#include<rpc/types.h>
#include<rpc/xdr.h>

il faut juste install portmap

smile
bisou et ailloli !


Distrib: Ubuntu 9.04
Citation : Si chuck Norris te dit que ta mère est bonne... tu peux l'appeler Papa

Hors ligne

#4 Le 04/12/2006, à 17:21

GuiGeek

Re : [RESOLU] Requête rpc: Programme en C : d'où vient l'erreur?

Salut,
je viens de regarder ton code et de le tester un peu mais il plante.
Tu as vraisemblablement oublié de faire des malloc avant le strcpy dans le client
voila a bientot
GuiGui

#5 Le 04/12/2006, à 17:50

GuiGeek

Re : [RESOLU] Requête rpc: Programme en C : d'où vient l'erreur?

re smile
en fait en regardant mieux t'es sur qu'il marche ce code ?
tu concatène avec des strcpy je pense que strcat serait plus adapté ...
enfin bon ... si tu as besoin d'un code qui marche correctement j'ai corrigé ...
++
GuiGui