Programme serveur/client en c
lillyz
Messages postés
16
Date d'inscription
Statut
Membre
Dernière intervention
-
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
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;
}
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:
- Programme serveur/client en c
- Cybera client - Télécharger - Divers Réseau & Wi-Fi
- Changer serveur dns - Guide
- Filezilla client - Télécharger - Téléchargement & Transfert
- Programme demarrage windows - Guide
- Filezilla client ou serveur ✓ - Forum Réseau
2 réponses
:-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.
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.
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
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
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.
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.