CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Serveur + socket + BDD

powercroatia
powercroatia
Niveau 7
16 décembre 2006 à 11:31:11

Bonjour,
je dois réaliser un projet qui consiste a gérer les processus qui s´ouvrent sur les pc d´un parc informatique. Ces liste de processus se trouvent sur chaque pc de chaque client.
Un serveur va ensuite centraliser les infos, en intérogeant (à intervalles de temps définis) chaques pc, puis va utiliser les infos présentes dans les fichiers texte (qui contiennent une liste des processus). Ensuite, ces processus vont etre enregistrés dans une base de donnée...

Pour réaliser les échanges client/serveur, je dois utiliser les socket, seulement mes connaissances dans ce domaine ne dépassent pas la demande de connection a une socket, et l´envoi d´un paquet. Donc je ne vois pas comment faire pour :

  • interoger le/les clients
  • lire le fichier texte situé chez les clients pour récuperer ensuite les info
  • stocket ces informations dans une BDD

Pouvez vous SVP me donner quelques info pour réussir ce projet, ou connaissez vous des scripts qui ressemblent un peu à ce que je dois réaliser ?
D´avance merci, a bientot

godrik
godrik
Niveau 30
16 décembre 2006 à 11:49:40

le ´serveur´ ouvre une connexion sur chaque client. (on suppose qu´il dispose d´une liste des machines clientes).
Quand un client recoit une connexion, il envoie au serveur la liste des processus.
le serveur dispose de la liste des processus, il fait sa vie avec.

Sa vie c´est ´mettre la liste dans une BDD´. L´interfacage avec une BDD en C a déjà été évoqué sur ce forum. La grande piste: ODBC

powercroatia
powercroatia
Niveau 7
17 décembre 2006 à 11:21:41

Déja merci bcp pour ta réponse godrik.
Seulement j´ai encore un pti souci, est ce que le fait d´envoyer carrement le fichier de la liste des processus du client au serveur n´est pas un peu trop "lourd". En +, cette tache est a faire toute les minutes.
Est ce que ça serait pas plus commode pour le serveur de lire directement le fichier sur le client.
La 1ere solution c´est assez facile, par contre la 2eme je ne connais pas de fonctions qui réalise cette tache.

godrik
godrik
Niveau 30
17 décembre 2006 à 15:17:18

quel différence cela fait il ?
en terme de flux, la même quantité d´information circulera.

powercroatia
powercroatia
Niveau 7
27 décembre 2006 à 13:59:17

je revient sur ce poste, car après pas mal de recherche sur le net, je ne trouve rien sur l´envoi de fichier par socket. Pour l´instant j´ai 2 scripts ,1 coté serveur et l´autre coté client, et je peux simplement envoyer des messages du client vers le serveur.
Pourriez vous m´aider svp ? mes connaissances en socket sont assez limités ...

Pour ceux que cela intéresse:

CLIENT:

  1. define nomhoteserveur "PC_Distant"
  2. define portserveur 11111

struct sockaddr_in adrserveur; /* Adresse du serveur */
struct sockaddr_in adrclient; /* Adresse du client */
int s; /* Numero socket */
char message[100]; /* Tampon Donnees niveau application */
struct hostent *h;

/*************************************************

    • **********************/

void main()
{

/******************** CREATION DE LA SOCKET *****************************/
if ( (s=socket(AF_INET,SOCK_STREAM,6)) == -1) /* 6 = numero protocole TCP*/
{ printf(">>> %s\n\n" , "Creation socket impossible");
exit(1);
}

/************** INITIALISATION DE L´ADRESSE DU SERVEUR ***************/
adrserveur.sin_family = AF_INET;
if ( (h=gethostbyname(nomhoteserveur)) == NULL )
{ printf("\n>>> %s\n\n" , "Nom hote serveur inconnu");
exit(1);
}
memcpy ( &adrserveur.sin_addr , h->h_addr , h->h_length );
adrserveur.sin_port = portserveur;

/******** DEMANDE DE CONNEXION ********************************************/
if (connect(s,(struct sockaddr*) &adrserveur,sizeof(adrserveur)) == -1)
{ printf("\n>>> %s\n\n" , "Connexion au serveur impossible");
exit(1);
}

/******** EMISSION DU MESSAGE (bind automatique) ************************/
while (1) /* Boucle sans fin, arret par control-C */
{

printf("|Message: ");
gets(message); /* lit une ligne, scanf ne lit qu´un mot */
if (write(s,message,strlen(message)+1) == -1)
{ printf("\n>>> %s\n\n" , "Emission du message impossible");
exit(1);
}
}

exit(0);
}

SERVEUR:

  1. define portserveur 11111

struct sockaddr_in adrserveur; /* Adresse serveur */
struct sockaddr_in adrclient; /* Adresse client */
int lgadrclient = sizeof(adrclient);
int s; /* Numero socket */
int cli_sock; /* Numero socket client */
int n; /* Nombre de caracteres lus */
char message[100]; /* Tampon reception niveau application*/
struct hostent *h;

/*************************************************

    • **********************/

void main ()
{
/*********************** CREATION DE LA SOCKET D´IDENTIFIANT s **********/
if ( (s=socket(AF_INET,SOCK_STREAM,6)) == -1 )
{ printf("\n>>> %s\n\n" , "Creation socket impossible");
exit(1);
}
/*********** LIEN DE LA SOCKET s A L´ADRESSE DU SERVEUR ******************/
adrserveur.sin_family = AF_INET;
adrserveur.sin_addr.s_addr = 0; /* 0.0.0.0 <---> adresse locale */
adrserveur.sin_port = portserveur;
if ( bind(s,(struct sockaddr*) &adrserveur,sizeof(adrserveur)) == -1 )
{ printf("\n>>> %s\n\n" , "Lien de la socket a l´adresse impossible");
exit(1);
}

/******** PASSAGE DE LA SOCKET EN ECOUTE PASSIVE *************************/
printf("Attente de connexion \n");
/*pause(2);*/
listen(s,10);

/******** ACCEPTATION DE CONNEXION ***************************************/
lgadrclient = sizeof(adrclient);
cli_sock = accept(s,(struct sockaddr*) &adrclient,&lgadrclient);
printf("Connexion etablie par le client:\n");

if ( (h=gethostbyaddr((char *) &adrclient.sin_addr.s_addr,
sizeof(adrclient.sin_addr.s_addr),AF_INET)) == NULL)
{ printf("\n>>> %s\n\n" , "Nom hote client inconnu");
exit(1);
}
printf("|| %s %d\n" , h->h_name , adrclient.sin_port );

/******** RECEPTION ET AFFICHAGE DES MESSAGES *************** ***********/

while (1)
{
n = read(cli_sock,message,sizeof(message));
if ( n == -1 )
{ printf("\n>>> %s\n\n" , "Lecture du message impossible");
exit(1);
}

printf("|| Client: %s %d\n" , h->h_name , adrclient.sin_port );
printf("|| message: %s\n\n" , message);
}

}

godrik
godrik
Niveau 30
27 décembre 2006 à 14:55:41

plusieurs choses:
1/ On ne met pas de code long sur le forum. On ne peut rien lire du au formatage des post par le site web. On préfère l´utilisation d´un wall. Par exemple:
http://rafb.net/paste/

2/ Pour le numero du protocole TCP, tu devrais utilise getprotoent plutot que de mettre 6 dans ton code.

3/ Le C n´est pas un script.

4/ On ne dit pas "ca marche pas". On donne le comportement que l´on obtient et l´on precise le comportement que l´on attends.

5/ Les sockets peuvent etre utilisé en lecture comme en ecriture.

6/ Tu arrives visiblement a envoyé l´entré standard de ton client vers le serveur. Il te suffit de lire ton fichier au lieu de l´entré standard. Regardes les fonctions fopen/fgets/fclose.

powercroatia
powercroatia
Niveau 7
27 décembre 2006 à 18:08:33

merci pour tous ces conseils
J´ai regardé la doc des fonctions que tu m´a dit, seulement j´ai une question:
Le client lit le fichier texte et envoi ligne par ligne ce qui se trouve dans le fichier (dans une boucle while d´apres ce que j´ai compris), mais ensuite comment le serveur va-t-il lui-meme enregistrer ces lignes dans son propre fichier texte ?
Désolé si cette question peut paraitre bête, mais je n´ai aucune notion de socket.
Merci et a bientot :ok:

powercroatia
powercroatia
Niveau 7
27 décembre 2006 à 21:26:29

J´ai trouvé un lien ou une personne a posté un code semblable à ce que je veux faire. J´ai repris ce code du coté de la machine qui DOWNload le fichier.(après je m´attaquerais a la parie UPload)
Voici ce que cela donne:
http://rafb.net/p/U0xIdP80.html

J´ai des souci du coté de la variable "cmd" ligne 27
error: ´cmd´ undeclared (first use in this function)
Je ne vois pas ni a quoi elle sert, et surtout comment la déclarer comme il faut...

dnob700
dnob700
Niveau 10
28 décembre 2006 à 16:02:54

c´est le problème quand on copie-colle un code sans le comprendre

Pour ton problème, tu avait presque tout : une fois que tu sais lire ligne par ligne un fichier,et que tu peutl´envoyer, pour celui qui le recoit, l´écrire,c´est pareil,avec les fonctions fopen/fputs/fclose (ou fprintf à la place de fputs).

powercroatia
powercroatia
Niveau 7
28 décembre 2006 à 16:25:46

euh bah pour l´instant je ne m´occupe pas de l´envoyer, j´essai déja de compiler le code de la machine qui recoit :)
Il me reste encore des erreurs au niveau du get_recep (ce que je comprend pas car la syntaxe m´a l´air correct),et à la fin pour la fermeture de la socket...
:108: error: syntax error before ´;´ token recv.c
:109: error: ´get_recep´ undeclared (first use in this function) recv.c
:109: error: (Each undeclared identifier is reported only once recv.c
:109: error: for each function it appears in.) recv.c
:109: error: syntax error before ´;´ token recv.c
:114: error: syntax error before numeric constant recv.c
:118: error: syntax error before ´}´ token

je vous dispense des warning car yen a pas mal lol

voici mon code coté machine qui download
http://rafb.net/p/NyvtnQ36.html

PS: get_recep[BUFSIZE] avec ou sans * c la meme chose

powercroatia
powercroatia
Niveau 7
28 décembre 2006 à 17:51:42

C bon j´ai rodé le ; apres le define qui coincait

Je me suis maintenant attaqué au fichier d´envoi de donné (bon courage lol)

voila mon code apres modif,
http://rafb.net/p/rXMS7P63.html
j´ai des erreur sur la variable buffer, le bzero est-il vraiment indispensable ?
bzero - Ecrire des zéros dans un bloc d´octets.

Si oui, Comment regler l´erreur ligne 61 svp ?
:72: error: ´buffer´ undeclared (first use in this function)
:72: error: (Each undeclared identifier is reported only once
:72: error: for each function it appears in.)
:61: error: ´buffer´ undeclared (first use in this function)
:61: error: (Each undeclared identifier is reported only once
:61: error: for each function it appears in.)

Sinon j´ai une tout autre question, comment se fait il que j´ai ces erreurs en compilant avec devc++ ,alors que sous linux elle n´aparait pas ?
25 `AF_INET´ undeclared (first use in this function)
pour la ligne

if ( (s=socket(AF_INET,SOCK_STREAM,6)) == -1)

j´aimerais pouvoir compiler sur windows, meme si ce script je dois m´en servir sous linux ,c´est lourd de devoir tout le temps redemaré sous linux pour tester. D´ailleur j´avai déja une erreur de ce type avec le script d´envoi
16 invalid application of `sizeof´ to incomplete type `sockaddr_in´
pour la ligne suivante:

int lgadrclient = sizeof(adrclient);

j´ai essayé int lgadrclient = sizeof(struct sockaddr_in); mais rien

godrik
godrik
Niveau 30
28 décembre 2006 à 20:01:23

Et si tu suivais un cours de programmation ?

powercroatia
powercroatia
Niveau 7
28 décembre 2006 à 22:24:53

voila j´ai testé le fonctionnement. Je lance mon programme serveur (qui doit recevoir le fichier) ,ensuite je lance le client ,et sur le serveur j´ai ce message d´erreur: "fseek() :invalid argument". Par contre, le serveur créer bien un fichier nommé fichier_recv.txt,mais evidemment ya rien dedans...
Il marque aussi "On a mis a 0 jusqua le position 0" (comme il n´a rien envoyé)

code coté serveur
http://rafb.net/p/JYqyrm57.html

code coté client (qui envoi les données)
http://rafb.net/p/ntNXam18.html

dsl godrik mais les socket ne sont pas ma spécialités, et vu que pour mon projet je dois passer par cette étape (qui est 5% de tout mon projet) j´ai besoin d´aide dans ce domaine. Mais je comprend ta colère et j´en suis désolé :snif:

godrik
godrik
Niveau 30
28 décembre 2006 à 23:02:22

ce n´est pas de la colere. juste que tu perds ton temps a faire des copier/coller de tout et rien sans vraiment les comprendre...
Tu n´as pas que des problemes avec le réseau visiblement. Suis un vrai cours de programmation. C´est la seule chose que je peux te conseiller.

powercroatia
powercroatia
Niveau 7
02 janvier 2007 à 13:22:30

c´est bon mon code marche enfin,mais j´ai encore un petit souci.
Comment se fait-il que lorsque j´ai fini d´envoyer un fichier au serveur,le script serveur s´arrete.. Pourtant j´ai enlevé tout les exit(-1) de la partie RECEPTION ET AFFICHAGE DES MESSAGES...

Code serveur modifié pour eviter l´arrêt du programme sauf quand le client envoie "exit"
http://rafb.net/p/GnnVh696.html

d´avance merci, et bonne année ;)

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment