Programme serveur/client en c

Fermé
lillyz Messages postés 16 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 2 avril 2013 - Modifié par lillyz le 13/01/2011 à 02:08
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 13 janv. 2011 à 13:56
Bonjour,

J'ai écris un programme serveur client en utilisant les signaux et un tube de communication

celui ci gère l'ajout d'un client à la liste des contacts et l'envoi des msg

mon prog est divisé en 2 partis: client.c et serveur.c

Lors de la compilation de mon prog serveur.c j'ai des erreur de compiltion que je n'arrive pas à résoudre:
Undefined symbols:
"_recherche", referenced from:
_main in cc26fZat.o
"_strcmpr", referenced from:
_main in cc26fZat.o
_main in cc26fZat.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

ci dessus mon prog serveur.c, il est bien commenté, merci de m'aider svp, je dois rendre mon projet dans peu de jours

#include <stdio.h> // les includes obligatoires
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/signal.h>

#define TAILLE 1024
#define MAX_CLIENTS 20

typedef struct req
{
int pid;
int uid;
char message[TAILLE];
} chat;

int recherhe(chat contact, chat* tabUsers, int nbrUsrers)
//recherche un client dans la liste des contacts, renvoi -1 s'il n'y figure pas et son indice dans le cas inverse
{
int position=0;
while ((position<nbrUsrers) && (tabUsers[position].pid != contact.pid))
{
position++;
}
if(position<nbrUsrers) return position;
else return -1;
}

int main()
{
int fdTube; // contient le fd du tube de communication
int countClient, nbrClients=0, indiceClient; /*position du client dans le tab_clients */
int n;
chat client;
chat tab_clients[MAX_CLIENTS]; //2: pour le pid et le uid

mkfifo("tube", 777);
puts("Attente de la connexion d'un utilisateur..."); //attente de la requete JOIN

while (1)
{
fdTube = open("tube", O_RDWR); //ouvrir le tube en mode lecture ecriture

while((n=read(fdTube, &client, sizeof(chat)))==0); //*****

if( ((indiceClient=recherche(client, tab_clients, nbrClients)) != -1) && (nbrClients>0) )
//le client figure dans la liste des contacts et envoi un message
{

if(strcmpr(client.message, "QUIT")==0) //le client demande de quitter
{
countClient=indiceClient;
while(countClient<=nbrClients) //Le client est supprimé de la liste des contact
{
tab_clients[countClient]=tab_clients[countClient+1];
countClient++;
}
nbrClients--;
kill(client.pid, SIGKILL); //le serveur lui envoyer un signal pour sortir du chat
puts(client.message); // affichage du message du client
}


else //le client envoi un message normal
{
write(fdTube, &client, sizeof(chat));
printf("PID[%d] UID[%d] dit:", tab_clients[indiceClient].pid, tab_clients[indiceClient].uid);
kill(tab_clients[indiceClient].pid, SIGUSR1); //Affichage du msg du client
}
}
//le client ne figure pas dans la liste des contacts et envoi un message

else if (strcmpr(client.message, "JOIN")==0) //le client demande de joindre le chat
{
if (nbrClients<MAX_CLIENTS) //le nombre max des clients n'est pas encore atteint
{
tab_clients[nbrClients].pid=client.pid; //ajout du client dans la liste des contacts
tab_clients[nbrClients].uid=client.uid;
nbrClients++;
strcpy(tab_clients[nbrClients].message, client.message); //affichage du msg du client
puts(client.message);
kill(client.pid, SIGUSR2); //envoi de confirmation de connexion au client
}

else //le nombre max des clients est atteint
{
strcpy(tab_clients[nbrClients].message, client.message); //affichage du msg du client
puts(client.message);
kill(client.pid, SIGINT); //envoi de confirmation de connexion au client
}

}

else //le client ne figure pas dans la liste des contact et envoi un message differet de JOIN
{
kill(client.pid, SIGUSR2); //envoi d'un message au client pour lui demande de joindre le chat
//puts(client.message); //Affichage du message du
}
close(fdTube);
}

return 0;
}










A voir également:

2 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
13 janv. 2011 à 08:51
:-D
Erreur de base super facile. Méthode pour trouver : problème de link, donc code source ok, chercher les symbole et bien tout vérifier.
ta fonction s'appele "recherhe", et dans le main tu appels "recherche", il y a un "c" en trop.
Je ne connais pas la fonction "strcmpr" et tu ne la défini pas alors, là je sèche.
Il faudrait que tu change de standard C, il y en a qui détecte lors de la compilation les fonctions non déclarer, ce qui est plus clair qu'un problème à l'édition des liens.
0
lillyz Messages postés 16 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 2 avril 2013
13 janv. 2011 à 12:45
Bonjour Char Sniper,

effectivement javais 2 erreurs
pour "strcmpr" je voulais en effet utiliser "strcmp" de la librairie <string.h>
et j'ai ajouté un c manquant dans ma fonction "recherhe"

puisqu'il n'y avait pas de nº de ligne des erreurs j'étais perdu.
merci pour ton aide précieu

en effet j'utilise le xcode du mac os version 3.1.3 et je crois que c'est celui qui me convient le mieux,
là j'ai compilé juste à partir du terminal en utilisant "gcc -o ...", mais en retestant ce matin avec xcode j'ai détecté les erreurs
tu as parlé de changement de standar C c'est nouveau prq, on le fais comment
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
13 janv. 2011 à 13:56
avec gcc tu as l'option -std= https://linux.die.net/man/1/gcc
donc gcc -std=C99 pour la dernière version.
Tu as tout une palanquée d'option pour définir le comportement. Une option intéressante aussi c'est "-Wall" qui active tout les warnings. Ce genre d'erreur est souvent détecté en warning.
0