FORUM Syndrome-OC - Jacky-PC


  Programmation


  Langage haut niveau(C, Pascal...)


  j'ai besoin d'un peu d'aide pour demarer

 




pluton52 Le salon de discussion : Dj_Gogo_2000 Godet Ln2 et Azote liquide : guy68 et 25 utilisateurs inconnus

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

j'ai besoin d'un peu d'aide pour demarer

n°1682
didkill
Posté le 09-02-2004 à 16:10:34  profilanswer
 

salut à tous.
je suis etudiant au CNAM à paris, en 1er année d'ingenierie.
pendant les 3 années passé au CNAM, j'ai etudier le langage ADA, HTML, et un peu de PHP.
mais jamais je n'ai touché au C, ( je sais que j'aurais du m'y mettre avant )
on me demande aujourd'hui de faire un petit projet en C, et franchement, j'y connais rien
j'aurais voulus qu'on m'oriente un peu sur des liens qui m'aiderai dans ce projet, j'ai besoin de conseils, d'un peu d'aide, et de beaucoup de patience.
et je pense que j'y arriverai.
je vous met en liens le projet qu'on ma demandé de faire, pour que vous voyez un peu de quoi ca parle.
http://magicar.free.fr/mini_projet.pdf
j'ai demandé à mon prof pourquoi donner un projet en C alors que ce langage n'est paq au programme dans cette ecole, ils m'a repondu que le CNAM servait surtous à ce perfectionner, et que les etudiant avais à travailler d'eux meme, ce que j'essaie de faire là
 
merci à tous à ceux qui voudrons bien m'aider
 
@+
didkill@free.fr

mood
Google
Posté le 09-02-2004 à 16:10:34  profilanswer
 

n°1684
Dr Lous
I see old password
Posté le 09-02-2004 à 18:48:22  profilanswer
 

ben les aplis sont pas dur a faire, tu doit savoir traiter des variables en C, creer des childs, et on finit avec une gestion rezo ou socket (depends de toi la)
 
Disons ke le plus "dur" et la creation d'un systeme de comm entre client serveur... le reste, c asser simple vu ce ke tu as deja fait avant :)


---------------
Oseras-tu m'affronter ?
n°1702
didkill
Posté le 10-02-2004 à 11:45:51  profilanswer
 

merci pour ta reponse
leprobleme, c'est que je ne sais pas comment traiter le sujet, à la rigueur ce que je pourais faire, c'est 2 procedures, l'une demandant de rentrer les données des variable ( ici en locurence, les taille des coté des rectangles ), et l'autre traitant les données et renvoyant le resultat.
le probleme, c'est que je ne sais pas du tout comment faire pour que ce soit de la forme client serveur.
en ADA, ( le langage que j'ai le plus etudié ), j'aurais utilisé une procedure et integré dans cette procedure une fonction calcul_air, qui retourne la reponse.
la visiblement, c'est pas ce qu'il faut faire
 

n°1713
Dr Lous
I see old password
Posté le 10-02-2004 à 17:28:37  profilanswer
 

tu doit le faire en ADA ou en C ?


---------------
Oseras-tu m'affronter ?
n°1726
didkill
Posté le 11-02-2004 à 14:52:14  profilanswer
 

en C
c'est ca le probleme,
j'ai reussit ( grace a de l'aide, et en piochant a droite a guache ) a faire la 1er question du sujet ( client serveur simple ) mais je ne sais pas comment fonctionne les PID et Fork pour utiliser un processus fils pour le serveur ( question 2 )
si vous avez une idée, ou connaisser la syntaxe ce serai vraiment sympa

n°1727
CryoGen
Powered by kitkat©
Posté le 11-02-2004 à 15:00:45  profilanswer
 

fork() creer un fils et retourne le PId de celui ci
pour savoir si tu est dans le fils ou dans le pere tu teste  
ex : res = fork();
     if(res < 0) //erreur
     ...
     if (res == 0) // on est dans le fils
     else // on est dans le pere

n°1728
Deadog
Dain Bramaged
Posté le 11-02-2004 à 15:04:55  profilanswer
 

accroche toi pke c'est tordu :D
 
fork ne permet pas de lancer directement un autre programme (ça serait trop beau :))
fork permet de créer un autre processus de ton programme
fork c'est de l'anglais (:D) et ça veux dire fourchette
c'est ce ki se passe pour ton programme
il se dévise en 2 processus, qui habituellement n'éxécute aps le même code
 
en pratique on écrit ça comme ça :
 

Code :
  1. swith (fork()) {
  2.   case -1:
  3.     // Erreur du fork
  4.   break;
  5.   case 0:
  6.     // Code du processus fils
  7.   break;
  8.   default:
  9.     // Code du processus parent
  10. }


 
 
1ère partie du court terminé :D
dans nos prochaines aventure je t'expliquerai comment lancé un autre programme et après comment comuniquer avec lui en établissant un pipe enter vous deux :)
 
la je vais chercher comment on fait pke j'ai la mémoire courte :D


Message édité par Deadog le 11-02-2004 à 15:05:51
n°1729
CryoGen
Powered by kitkat©
Posté le 11-02-2004 à 15:07:19  profilanswer
 

Pas bete le coup du switch... ;)
 
J'ai des codes sources sur fork et pipe si ca t'interresse


Message édité par CryoGen le 11-02-2004 à 15:08:18
n°1730
Deadog
Dain Bramaged
Posté le 11-02-2004 à 15:34:14  profilanswer
 

alors, j'ai retrouvé mes sources de ThacidLCD :)
donc voila comment monter un pipe entre 2 processus :p :
 
le principe est :
-ouvrir un pipe
-fermer le stdout dans le process fils (le file descriptors de stdout est 1)
-faire un dup du stdout dans le processfils
-executer ton programme externe avec excelp dans le processus fils
-tu fais attendre le processus père le temps que le fils se termine (obligé), dans un fork on fait ça avec "wait (NULL);"
-tu fais lire dans le pipe le processus père
 
en gros :
 

Code :
  1. char buf[BUFSIZ];
  2. int fd[2];
  3. if(pipe(fd) < 0) return -1;
  4. switch (fork()) {
  5.   case -1:
  6.     return 0;
  7.   break;
  8.   case 0:
  9.     if(close(1) < 0) return -1;
  10.     if(dup(fd[1]) < 0) return -1;
  11.     execlp("uname", "uname", "-n", NULL); // Faudrait reprendre le man de execlp, je sais plus à koi correspondent les 2 premiers arguments
  12.   break;
  13.   default:
  14.     wait(NULL);
  15.     while (read(fd[0], buf, BUFSIZ)  != 0 && fd[0]) {
  16.       ...
  17.     }
  18. }
  19. return 0;


 
le macro BUFFSIZ est normallement donné dans l'header d'une des librairie standart, ça doit être stdio.h il me semble


Message édité par Deadog le 11-02-2004 à 15:39:53
n°1731
Deadog
Dain Bramaged
Posté le 11-02-2004 à 15:36:04  profilanswer
 

euhhh, tout ça c'est en programmation posix & gcc
si tu es sous windows avec visual c++ ou devcpp je suis pas sur ke ça marche :p
 
 
sinon il me semble ke tu as aussi popen ki est plus simple (bcp plus simple !!) mais ki bouffe un peu trop de temps cpu à mon gout
m'enfin, avec ce ke je t'ai donné tu peux montrer que tu en sais sur le C :D
(d'autant que mon code est protégé contre les overflow, ce ki peux légèrement monter ta note si le correcteur est pas trop con :D)


Message édité par Deadog le 11-02-2004 à 15:39:05
n°1732
Deadog
Dain Bramaged
Posté le 11-02-2004 à 15:43:32  profilanswer
 

avec popen :
 

Code :
  1. FILE *ptr;
  2. char buf[BUFSIZ];
  3. if ((ptr = popen("uname -n", "r" )) != NULL) {
  4.   while (fgets(buf, BUFSIZ, ptr) != NULL && ptr) {
  5.     ...
  6.   }
  7. }
  8. pclose(ptr);
  9. return 0;


 
si tu fais un return dans la boucle n'oublie surtout pas de faire pclose(ptr); avant ton return !

n°1787
didkill
Posté le 12-02-2004 à 21:47:29  profilanswer
 

merci a tous pour vos nombreuse reponse
comme je vous disez, j'ai finit la question 1 du mini projet qu'il m'ont demander
j'ai lu vos message, et je crois comprendre ce qu'il faut faire, mais moi, je voyais un truc beaucoup plus simple que des pipes, ou des truc comme ca, je pensais qu'il etait possible, de recuperer le code du serveur, qui calcule les surface et circonference, de creer un troisieme processus ( serveur2 ) avec toute les operation recuperer oparavant
et ensuite dans serveur 1, de lancer serveur 2 apres avoir recuperer les infos du clients, pour qu'il calcul ce qu'il faut
ensuite serveur 2 envoie ses reponse au serveur 1 qui transmet aux clients
 
est ce paussible, et est ce plus facile
je vous colle en dessous, le code du serveur et du client pour que vous voyez de quoi je parle
merci encore

n°1788
didkill
Posté le 12-02-2004 à 21:47:53  profilanswer
 

//SERVEUR
#include <winsock.h> // pour le send
#include <iostream.h>
#include <math.h> // pour les calculs
#include <stdlib.h> // pour les conversion atoi itoa
#include <string.h>
 
void main()
{
char buffer[1024];
//char inter[1024];
 
float pi=3.141592654;
int cir=0;
int r,a,b;
int choix;
char *ptr;
float resultat;
 
 
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0),&WSAData);
SOCKET sock;
SOCKET csock;
SOCKADDR_IN sin;
SOCKADDR_IN csin;
 
cout << "                                 << SERVER >>"<<endl<<endl<<endl;
 
sock = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_addr.s_addr   = INADDR_ANY;
sin.sin_family    = AF_INET;
sin.sin_port    = htons(50);
bind(sock, (SOCKADDR *)&sin, sizeof(sin));
listen(sock, 0);
 
 while(true)
  {
   int sinsize = sizeof(csin);
   if((csock = accept(sock,(SOCKADDR *)&csin,&sinsize)) != INVALID_SOCKET)
   {
 
             int i = recv(csock,buffer,sizeof(buffer),0);
             if (i != false)
             {
 
             choix=atoi(buffer);
 
             switch (choix)
             {
                 case 1 :
                 {
                 ptr = strstr(buffer,"x" );
                 ptr++;
                 a = atoi(ptr);
                 ptr = strstr(buffer,"q" );
                 ptr++;
                 b = atoi(ptr);
                 resultat= (a+b)*2;
 
                 }break;
 
                 case 2 :
                 {
                 ptr = strstr(buffer,"x" );
                 ptr++;
                 a = atoi(ptr);
                 ptr = strstr(buffer,"q" );
                 ptr++;
                 b = atoi(ptr);
                 resultat= a*b;
 
                 }break;
 
                 case 3 :
                 {
                 ptr = strstr(buffer,"x" );
                 ptr++;
                 r= atoi(ptr);
                 resultat= r*pi*2;
                 }break;
 
                 case 4 :
                 {
                 ptr = strstr(buffer,"x" );
                 ptr++;
                 r= atoi(ptr);
                 resultat= r*r*pi;
                 }break;
 
 
             }//fin du switch
 
             //renvoie du resultat au client
             cout << endl << "Le Resultat est de : "  << endl  << resultat << endl;
 
             char envoi[10];
             int c = resultat;
             itoa(c,envoi,10);
 
    send(csock,envoi,50,0);
 
             }//fin du if
             else cout<<"Ne marche pas !!";
   }
       }
closesocket(sock);
WSACleanup();
}

n°1789
didkill
Posté le 12-02-2004 à 21:48:14  profilanswer
 

//CLIENT
#include <stdio.h>   //standard
#include <iostream.h>//pour le cout (c++)
#include <winsock.h> //pour la connexion sur le serveur
#include <conio.h>   //pour le getch() - la pause a la fin
#include <string.h>  //pour les chaines
#include <stdlib.h>  //pour le itoa()
 
void main()
{
char buffer[1024];
char r[3],a[3],b[3];
char envoi[10];
int choix=0;
 
cout << "                                 << CLIENT >>"<<endl<<endl<<endl;
 
 
 
 
 //MENU de choix
 
  printf("\n1 - Perimetre d'un rectangle" );
  printf("\n2 - Surface d'un rectangle" );
  printf("\n3 - Circonference d'un cercle" );
  printf("\n4 - Surface d'un cercle" );
  printf("\n5 - Quitter" );
  printf("\n\nChoix : " );
  scanf("%d",&choix);
 
switch (choix)
{
 
    case 1 : {
    //perimetre d'un rectangle
 
    printf("Saisissez la largeur\n : " );
    scanf("%s",&a);
    printf("Saisissez la longueur\n : " );
    scanf("%s",&b);
 
    //connexion sur le server
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0),&WSAData);
    SOCKET sock;
    sock = socket(AF_INET,SOCK_STREAM,0);
    SOCKADDR_IN sin;
    sin.sin_addr.s_addr = inet_addr("127.0.0.1" );
    sin.sin_family      = AF_INET;
    sin.sin_port        = htons(50);
    connect(sock,(SOCKADDR *)&sin,sizeof(sin));
 
    itoa(choix,envoi,10);
    strcat(envoi,"x" );
    strcat(envoi,a);
    strcat(envoi,"q" );
    strcat(envoi,b);
 
    cout << envoi << "**" << choix << endl;
 
    send(sock,envoi,50,0);
 
    cout << endl <<"le perimetre du rectangle est de : ";
 
    //reception
    int i = recv(sock,buffer,sizeof(buffer),0);
    if (i != false)
    {
    cout << buffer << endl; //affichage du resultat
    }
   
    closesocket(sock); //fermeture du socket
    WSACleanup();
    }break;
 
    case 2 : {
    //surface d'un rectangle
 
    printf("Saisissez la largeur\n : " );
    scanf("%s",&a);
    printf("Saisissez la longueur\n : " );
    scanf("%s",&b);
 
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0),&WSAData);
    SOCKET sock;
    sock = socket(AF_INET,SOCK_STREAM,0);
    SOCKADDR_IN sin;
    sin.sin_addr.s_addr = inet_addr("127.0.0.1" );
    sin.sin_family      = AF_INET;
    sin.sin_port        = htons(50);
    connect(sock,(SOCKADDR *)&sin,sizeof(sin));
 
    itoa(choix,envoi,10);
    strcat(envoi,"x" );
    strcat(envoi,a);
    strcat(envoi,"q" );
    strcat(envoi,b);
 
    cout << envoi << "**" << choix << endl;
 
    send(sock,envoi,50,0);
 
    cout << endl <<"le perimetre du rectangle est de : ";
 
    int i = recv(sock,buffer,sizeof(buffer),0);
    if (i != false)
    {
    cout << buffer << endl;
    }
   
    closesocket(sock);
    WSACleanup();
    }break;
 
 
 
    case 3 : {
    //circonference d'un cercle
 
    printf("Saisissez le rayon du cercle\n: " );
    scanf("%s",&r);
 
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0),&WSAData);
    SOCKET sock;
    sock = socket(AF_INET,SOCK_STREAM,0);
    SOCKADDR_IN sin;
    sin.sin_addr.s_addr = inet_addr("127.0.0.1" );
    sin.sin_family      = AF_INET;
    sin.sin_port        = htons(50);
    connect(sock,(SOCKADDR *)&sin,sizeof(sin));
 
    itoa(choix,envoi,10);
    strcat(envoi,"x" );
    strcat(envoi,r);
 
    cout << envoi << "**" << choix << endl;
 
    send(sock,envoi,50,0);
 
    cout << endl <<"---> Donnees"<<endl<<"Rayon : "<<r<<endl<<endl<<"la circonference du cercle est de : ";
 
    int i = recv(sock,buffer,sizeof(buffer),0);
    if (i != false)
    {
    cout << buffer << endl;
    }
   
    closesocket(sock);
    WSACleanup();
    }break;
 
 
    case 4 : {
    //Surface d'un cercle
 
    printf("Saisissez le rayon du cercle\n: " );
    scanf("%s",&r);
 
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0),&WSAData);
    SOCKET sock;
    sock = socket(AF_INET,SOCK_STREAM,0);
    SOCKADDR_IN sin;
    sin.sin_addr.s_addr = inet_addr("127.0.0.1" );
    sin.sin_family      = AF_INET;
    sin.sin_port        = htons(50);
    connect(sock,(SOCKADDR *)&sin,sizeof(sin));
 
    itoa(choix,envoi,10);
    strcat(envoi,"x" );
    strcat(envoi,r);
 
    cout << envoi << "**" << choix << endl;
 
    send(sock,envoi,50,0);
 
    cout << endl <<"---> Donnees"<<endl<<"Rayon : "<<r <<endl<<endl<< "la surface du cercle est de : ";
 
    int i = recv(sock,buffer,sizeof(buffer),0);
    if (i != false)
    {
    cout << buffer << endl;
    }
   
    closesocket(sock);
    WSACleanup();
    }break;
 
    case 5 : break;
 
}
getchar();
getch();
 
}

n°1802
Deadog
Dain Bramaged
Posté le 13-02-2004 à 14:37:16  profilanswer
 

didkill a écrit :

merci a tous pour vos nombreuse reponse
comme je vous disez, j'ai finit la question 1 du mini projet qu'il m'ont demander
j'ai lu vos message, et je crois comprendre ce qu'il faut faire, mais moi, je voyais un truc beaucoup plus simple que des pipes, ou des truc comme ca, je pensais qu'il etait possible, de recuperer le code du serveur, qui calcule les surface et circonference, de creer un troisieme processus ( serveur2 ) avec toute les operation recuperer oparavant
et ensuite dans serveur 1, de lancer serveur 2 apres avoir recuperer les infos du clients, pour qu'il calcul ce qu'il faut
ensuite serveur 2 envoie ses reponse au serveur 1 qui transmet aux clients
 
est ce paussible, et est ce plus facile
je vous colle en dessous, le code du serveur et du client pour que vous voyez de quoi je parle
merci encore
 


 
 
han, ça m'apprendra à même pas lire l'énoncé :D
bon, déjà ce ki t'es demandé c'est ke le serveur2, comme tu l'appel, calcul et renvoie ses résultat au client.
En fait, tu ne dois pas faire revenir les infos à serveur1, ce ki simplifie énormément (j'me disais aussi, utiliser des pipes c un peu poussé pour un projet d'école)
en faite, il faut ke tu fasse comme ça :
 
-ton client envoie une demande à serveur1
-serveur1 la réceptionne, et classe toutes les infos nécessaire pour serveur2 dans une struct ou une class (par expl)
->pour cela tu la créer dynamiquement, comme ça c'est serveur2 ki s'en occupera et serveur1 pourra après toujours recevoir d'autre demande de client sans ce soucier d'écraser une ancienne demande
-serveur1 fait un fork de lui même
-dans la partie fils du fork tu implémente le code du serveur2
-dans la partie père du fork tu fait un retour en arrière dans ton code pour le renvoyer quasiement au début, cad tu le renvoie à la procédure d'attente et de réception d'une demande (utilise surtout pas de goto ! c'est à chié comme technique :D)
-pour le fils du fork, serveur2, tu lui fait faire les calculs k'il faut et après tu renvoie au client les résultats
->pour ça faut pas avoir oublier de mettre dans la struct ou la class les infos k'il faut sur le socket ki est ouvert entre le serveur et le client
-après tu peux libérer la mémoire occupé par la struct ou la class et terminer le serveur2
 
 
c la conception même d'un ptit serveur en fait, un processus ki reçois les requêtes en permanance (boucle infinie) et ki les redistribues
 
donc oublie les pipe et tout ça, ça sert à rien la ;)


Message édité par Deadog le 13-02-2004 à 14:38:54
n°1804
didkill
Posté le 13-02-2004 à 16:02:54  profilanswer
 

merci pour ta reponse
concraitement, qu'est ce que la partie pere du fork et la partie fils
j'aides exemple de fork, et ils sont de la forme :
int pid
pid = fork ()
if pid == -1
erreur
else
patati patata
 
quant j'essaye de faire un fork sur le programme, et que je compile avec devc++, j'ai toujours ue erreur de implicit argument fork (..)
je pense que ca vient d'une librairie que j'aurais pas mis dans le code
 
alors ùma question :
 
peut tu me faire un exemple de structure pere fils, et me dire sur mon programme ou la placer
et aussi quelle librairie est utlie pour le fork
 
je sais que j'en demande bcp, mais c'est pour demain, et j'ai plus vraiment le temps de faire les recherche moi meme
merci encore

n°1806
Deadog
Dain Bramaged
Posté le 13-02-2004 à 17:33:44  profilanswer
 

je te l'ai donné plus haut le moyen de faire un fork ;)
 

Deadog a écrit :


Code :
  1. swith (fork()) {
  2.   case -1:
  3.     // Erreur du fork
  4.   break;
  5.   case 0:
  6.     // Code du processus fils
  7.   break;
  8.   default:
  9.     // Code du processus parent
  10. }




 
 
pour la librairie, en posix c'est unistd.h mais je sais pas si c pareil pour devc++
 
et où le placer dans ton serveur ? bah des ke tu as reçus la demande et qu'elle est valide

n°1810
didkill
Posté le 13-02-2004 à 18:44:26  profilanswer
 

merci, pour tout, je crois avoir reussit, ca met encore quelques erreur, mais je corrige ca rapidement.
merci à tous pour la precieuse aide que vous m'avez apporté.
en esperant etre un jour assez doué pour pouvoir vous rendre l'appareil
 
encore merci
didkill

n°1811
KnX
To be or not to code.
Posté le 13-02-2004 à 19:02:10  profilanswer
 

( il a piqué l'appareil ? )


---------------
/!\ KnX's bash NP : Norah Jones - Don't Miss You At All /!\
n°1830
Deadog
Dain Bramaged
Posté le 14-02-2004 à 14:57:51  profilanswer
 

on dit rendre la pareil ;)

n°1959
gimly
Quel pseudo de merde !
Posté le 21-02-2004 à 10:39:27  profilanswer
 

tiens, enfin une personne qui a bossé sur ADA :-)
qu'est-ce que t'a fait de beau dessus et que penses tu de ce magnifique langage  ??? (je sais que je suis pas sur le bon topic, mais je t'invite à aller voir le mien sur mon projet ds cette même catégroei pour ne pas pertduber ce topic ;-)
 
Pour le c.... je ne commence qu'en fin d'année donc je ne peux absolument pas t'aider...

n°2034
didkill
Posté le 27-02-2004 à 19:39:05  profilanswer
 

desol&é du delai, mais j'etais en vacance ;)
pour le projet, je crois que ca c'est pas mal passé, mais j'aurais la note dans 2 semaines.
en tout cas merci a tous
pour gimly:
je trouve personnellement que l'ADA est 1000 fois plus simple que le C, et autant de fois plus conviviale, mais faut avouer qu'on peut pas faire autant de truc.
un serveur en ADA j'ai jamais vu ( peut etre qu'on peut mais moi je sais pas )
maintenant, je vais jeter un petit coup d'oeil sur ton projet, et je te dis ce que j'en pense
@+
et encore merci a tous

mood
Google
Posté le 27-02-2004 à 19:39:05  profilanswer
 


Aller à :
Ajouter une réponse

  FORUM Syndrome-OC - Jacky-PC


  Programmation


  Langage haut niveau(C, Pascal...)


  j'ai besoin d'un peu d'aide pour demarer

 

Hit Parade