begin process at 2012 05 27 14:36:08
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > CLIENT/SERVER [CODE EN C] [GCC]

CLIENT/SERVER [CODE EN C] [GCC]


 Information sur la source

Note :
3,08 / 10 - par 12 personnes
3,08 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseaux & Internet Niveau :Initié Date de création :23/11/2001 Vu :47 672

Auteur : Jo

Ecrire un message privé
Site perso
Commentaire sur cette source (22)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Et bien dans cet exempel je vais vous montrer et  expliquer ;-) comment realiser une connection client/server en utilisant les socket qui utilise un fichier "verouiller", ces code est pour les systeme typ Unix.


Source

  • /*********************/
  • /**** LE SERVER ******/
  • /*********************/
  • #include <sys/types.h>
  • #include <sys/socket.h>
  • #include <sys/un.h>
  • #include <stdio.h>
  • #define NSTRS 3 // nombre de lignes que l'on va afficher quand le client vas se connecter/
  • #define ADDRESS "mysocket" // addresse de connection
  • //Message que nous voulons envoyer au client
  • char *strs[NSTRS] = {
  • "Bonjour, je suis le server et j'envoi un message\n",
  • "au client, (ici nous somme ne deuxieme ligne).\n",
  • "et la et bien il faut dire enrevoir sur la 3eme ligne :-p.\n"
  • };
  • main()
  • {
  • char c;
  • FILE *fp;
  • int fromlen;
  • register int i, s, ns, len;
  • struct sockaddr_un saun, fsaun; //declaration des sockets
  • //Ici on creer une socket de type STREAM que l'on va utiliser poir la communication
  • //entre le server, ce fichier, et le client
  • if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
  • {
  • perror("server: socket"); //si ca foire on affiche => server: socket (c'est pour dire que c'est la socket du server qui a merder)
  • exit(1);
  • }
  • //on creer l'adresse avec laquel on va faire communiquer le server et le client
  • saun.sun_family = AF_UNIX;
  • strcpy(saun.sun_path, ADDRESS);
  • //ici on defait le lien que l'on avait creer sur ADRESSE
  • unlink(ADDRESS);
  • //la on prend la taille de la structure
  • len = sizeof(saun.sun_family) + strlen(saun.sun_path);
  • //la on fait ce que l'on appelle un bind (raccourci en francais)
  • if (bind(s, &saun, len) < 0)
  • {
  • perror("server: bind"); //si ca merde on affiche que c le bind qui merde
  • exit(1);
  • }
  • //on ecoute la socket
  • if (listen(s, 5) < 0)
  • {
  • perror("server: listen"); //si ca merde
  • exit(1);
  • }
  • //ici on accepte la connection du client
  • //et a ce moment la fsaun contient l'adresse du client
  • if ((ns = accept(s, &fsaun, &fromlen)) < 0)
  • {
  • perror("server: accept"); //bon comme vous l'avez compris ca c'est si ca merde
  • exit(1);
  • }
  • //ca c'est parceque l'on utilise stdio pour lire la socket
  • fp = fdopen(ns, "r");
  • //on commence par envoyer les strint (chaine de caractere :-p au client
  • for (i = 0; i < NSTRS; i++)
  • send(ns, strs[i], strlen(strs[i]), 0);
  • //quand le client lis les string il les affiche
  • for (i = 0; i < NSTRS; i++)
  • {
  • while ((c = fgetc(fp)) != EOF)
  • {
  • putchar(c);
  • if (c == '\n')
  • break;
  • }
  • }
  • //on a juste a utiliser tout simplement close(); pour fermer la socket
  • close(s);
  • exit(0);
  • }
  • /***********************/
  • /****** LE CLIENT *****/
  • /***********************/
  • //Bon la pour le client je n'est pas mis de commentaire car c'est quasiment identique au server les foonctions utilisees sont ls memes donc pas la peine de reexpliquer 2 fois la meme chose ;-)
  • #include <sys/types.h>
  • #include <sys/socket.h>
  • #include <sys/un.h>
  • #include <stdio.h>
  • #define NSTRS 3 // nombre de lignes que l'on veut envoyer au server
  • #define ADDRESS "mysocket" // adresse sur laquel on communique avec le server (en fait c'est un ficheir verrouiller que l'on creer)
  • //les messages que l'on veut envoyer au server
  • char *strs[NSTRS] = {
  • "Salut moi je suis le client.\n",
  • "et comme tu voi je peut aussi envoyer.\n",
  • "des messages lol.\n"
  • };
  • main()
  • {
  • char c;
  • FILE *fp;
  • register int i, s, len;
  • struct sockaddr_un saun;
  • if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
  • {
  • perror("client: socket");
  • exit(1);
  • }
  • saun.sun_family = AF_UNIX;
  • strcpy(saun.sun_path, ADDRESS);
  • len = sizeof(saun.sun_family) + strlen(saun.sun_path);
  • if (connect(s, &saun, len) < 0) {
  • perror("client: connect");
  • exit(1);
  • }
  • fp = fdopen(s, "r");
  • for (i = 0; i < NSTRS; i++) {
  • while ((c = fgetc(fp)) != EOF) {
  • putchar(c);
  • if (c == '\n')
  • break;
  • }
  • }
  • for (i = 0; i < NSTRS; i++)
  • send(s, strs[i], strlen(strs[i]), 0);
  • close(s);
  • exit(0);
  • }
/*********************/
/**** LE SERVER ******/
/*********************/


#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>

#define NSTRS       3           // nombre de lignes que l'on va afficher quand le client vas se connecter/
#define ADDRESS     "mysocket"  // addresse de connection 

//Message que nous voulons envoyer au client
char *strs[NSTRS] = {
  "Bonjour, je suis le server et j'envoi un message\n",
  "au client, (ici nous somme ne deuxieme ligne).\n",
  "et la et bien il faut dire enrevoir sur la 3eme ligne :-p.\n"
};

main()
{
  char c;
  FILE *fp;
  int fromlen;
  register int i, s, ns, len;
  struct sockaddr_un saun, fsaun;  //declaration des sockets
  
  //Ici on creer une socket de type STREAM que l'on va utiliser poir la communication
  //entre le server, ce fichier, et le client
  if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) 
  {
    perror("server: socket"); //si ca foire on affiche => server: socket (c'est pour dire que c'est la socket du server qui a merder)
    exit(1);
  }
  
  //on creer l'adresse avec laquel on va faire communiquer le server et le client
  saun.sun_family = AF_UNIX;
  strcpy(saun.sun_path, ADDRESS);
 
  //ici on defait le lien que l'on avait creer sur ADRESSE 
  unlink(ADDRESS);
  //la on prend la taille de la structure
  len = sizeof(saun.sun_family) + strlen(saun.sun_path);
  
  //la on fait ce que l'on appelle un bind (raccourci en francais)
  if (bind(s, &saun, len) < 0) 
  {
    perror("server: bind"); //si ca merde on affiche que c le bind qui merde
    exit(1);
  }
  
  //on ecoute la socket
  if (listen(s, 5) < 0) 
  {
    perror("server: listen");  //si ca merde
    exit(1);
  }
  
  //ici on accepte la connection du client
  //et a ce moment la fsaun contient l'adresse du client
  if ((ns = accept(s, &fsaun, &fromlen)) < 0) 
  {
    perror("server: accept"); //bon comme vous l'avez compris ca c'est si ca merde
    exit(1);
  }  
  
  //ca c'est parceque l'on utilise stdio pour lire la socket
  fp = fdopen(ns, "r");
  
  //on commence par envoyer les strint (chaine de caractere :-p au client
  for (i = 0; i < NSTRS; i++)
    send(ns, strs[i], strlen(strs[i]), 0);
  
  //quand le client lis les string il les affiche
  for (i = 0; i < NSTRS; i++) 
  {
    while ((c = fgetc(fp)) != EOF) 
    {
      putchar(c);
      if (c == '\n')
 break;
    }
  }
  
   //on a juste a utiliser tout simplement close(); pour fermer la socket
  close(s);
  
  exit(0);
}



/***********************/
/****** LE CLIENT  *****/
/***********************/

//Bon la pour le client je n'est pas mis de commentaire car c'est quasiment identique au server les foonctions utilisees sont ls memes donc pas la peine de reexpliquer 2 fois la meme chose ;-)


#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>

#define NSTRS       3           // nombre de lignes que l'on veut envoyer au server
#define ADDRESS     "mysocket"  // adresse sur laquel on communique avec le server (en fait c'est un ficheir verrouiller que l'on creer)

//les messages que l'on veut envoyer au server
char *strs[NSTRS] = {
  "Salut moi je suis le client.\n",
  "et comme tu voi je peut aussi envoyer.\n",
  "des messages lol.\n"
};

main()
{
  char c;
  FILE *fp;
  register int i, s, len;
  struct sockaddr_un saun;
  
  
  if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) 
  {
    perror("client: socket");
    exit(1);
  }
  
  saun.sun_family = AF_UNIX;
  strcpy(saun.sun_path, ADDRESS);
  
  
  len = sizeof(saun.sun_family) + strlen(saun.sun_path);
  
  if (connect(s, &saun, len) < 0) {
    perror("client: connect");
    exit(1);
  }
 
  fp = fdopen(s, "r");
 
  for (i = 0; i < NSTRS; i++) {
    while ((c = fgetc(fp)) != EOF) {
      putchar(c);
      
      if (c == '\n')
 break;
    }
  }

  for (i = 0; i < NSTRS; i++)
    send(s, strs[i], strlen(strs[i]), 0);
  
  close(s);
  
  exit(0);
}






  

 Conclusion

Bon faut copier coller les deux code dans 2 fichier different biensur, par exemple "server.c" et "client.c" vous les compiler chacun ensuite lancer le server dans uen console, puis dans une autre console lancer le client, le server vas recevoir les message du client et le client lui vas recevoir les mesage du server.
Pour mieux comprendre regarder le screenshot


 Sources du même auteur

Source avec Zip [G++] [CODE C++] BOTBATTLE
Source avec Zip [G++] [CODE C++] SERVER.CFG GENERATOR POUR COUNTER-STRIKE
LA CARTE AU TRESOR VERSION 0.3 [CODE EN C++] [G++]
CREATION DE CLASSE [CODE EN C++] [G++]
Source avec une capture CALENDAR [CODE C] [GCC]

 Sources de la même categorie

Source avec Zip Source avec une capture MINI SERVEUR HTTP [WINDOWS] par ganjarasta
Source avec Zip Source avec une capture CLIENT DE TEST MODBUS TCP par brunovan
Source avec Zip Source avec une capture SCANIP [ARP / ICMP] par ganjarasta
Source avec Zip Source avec une capture TRACEROUTE [WINPCAP] par ganjarasta
Source avec Zip SERVEUR MULTITHREAD [LINUX/WIN] par nipepsinicolas

Commentaires et avis

Commentaire de Jackboy le 03/03/2002 03:54:26

Marche pas chez moi deux erreurs. Compile avec vc++. Erreur client :client.c
fatal error C1083: Cannot open include file: 'sys/socket.h': No such file or directory
Error executing cl.exe
et erreur serveur:  serveur.c fatal error C1083: Cannot open include file: 'sys/socket.h': No such file or directory
Error executing cl.exe. Et question est t'il possible que plusieur utilisateur en meme temp ??


Commentaire de Jo le 03/03/2002 05:35:19

Salut Jackboy,
C'est normal toutes ces erreurs c'est parcke tu n'a pas le fichier sys/socket.h (peut etre il y a un ekivalent sous windows ...)
Si non non il ne peut pas avoir plusiuers client en meme temps.

Commentaire de Mawww le 27/06/2002 23:45:35

pour windows avec VC, inclus winsock.h a la place de sys/socket.h

Commentaire de Niko2012 le 10/07/2002 12:19:34

Bin quelques pbs aussi pour moi... pourtant je suis sous linus mais je passe par un shell (SSH)
A la compil de 'server.c' j'ai des warnings & je vois pas trop pourkoi:
server.c:51: warning: passing arg 2 of `bind' from incompatible pointer type
server.c:66: warning: passing arg 2 of `accept' from incompatible pointer type
Et a celle de 'client.c', idem ! (arg)
client.c:47: warning: passing arg 2 of `connect' from incompatible pointer type

Alors forcement, je ne suis pas etonne de ne pas voir marcher le prog sur ma becanne :'(
server: accept: Invalid argument
voila... pourtant tout m'avait l'air bien... si vous avez une idee
Thx, Niko

Commentaire de Niko2012 le 10/07/2002 12:20:07

Bin quelques pbs aussi pour moi... pourtant je suis sous linus mais je passe par un shell (SSH)
A la compil de 'server.c' j'ai des warnings & je vois pas trop pourkoi:
server.c:51: warning: passing arg 2 of `bind' from incompatible pointer type
server.c:66: warning: passing arg 2 of `accept' from incompatible pointer type
Et a celle de 'client.c', idem ! (arg)
client.c:47: warning: passing arg 2 of `connect' from incompatible pointer type

Alors forcement, je ne suis pas etonne de ne pas voir marcher le prog sur ma becanne :'(
server: accept: Invalid argument
voila... pourtant tout m'avait l'air bien... si vous avez une idee
Thx, Niko

Commentaire de Sardinoman le 03/11/2002 22:10:39

Bien le bonjour ! je c pa trop ou demander ca alors je le fais ici : vous connaitriez pa un bon site pour apprendre les sockets sous win ?
Bon ben voila... merci d avance

Commentaire de davwart le 19/11/2002 09:45:49

les warnings sont normaux.
pour eviter les warningd, il suffit de mettre (const sockaddr*) devant &saun dans l'argument numero deux de chaque fonction qui provoque des warnings.

Commentaire de MetalDwarf le 02/04/2003 16:17:36

Si tu veux que sa marche avec plusieurs client il faut utiliser select() (essaye man select...) ou poll() mais poll ca marche sous linux ou presque.
Voila c est tout :-)

Commentaire de MetalDwarf le 02/04/2003 16:17:43

Si tu veux que sa marche avec plusieurs client il faut utiliser select() (essaye man select...) ou poll() mais poll ca marche sous linux ou presque.
Voila c est tout :-)

Commentaire de clesteur le 23/06/2003 14:16:21

j'ai essai de compiler avec VC en ayant mit winsock.h a la place de sys/socket.h
mais il ne connait pas sys/un.h
y a t'il aussi un equvalant

Commentaire de D1m3x le 07/07/2003 21:20:42

le meilleur la dedans: la capture d'écran MDR

non pas mal;) =)

Commentaire de Narcissus le 09/07/2003 20:18:20

salut jo, tu pourrais pas m'envoyer les fichiers d'en tete que tu as utilisé pour realiser ce prog.
merci

Commentaire de Ifrit235 le 26/02/2004 22:11:35

LOL MDR la capture d'écran. C'est vrai après tout on peut pas être programmeur et graphiste a la fois ll ;)

Commentaire de joe_le_mag le 20/05/2004 23:38:07

en réponse aux messages d erreurs (warning: passing arg 2 of `connect' from incompatible pointer type), il faut ajouter  (struct sockaddr *) devant les parametres causant les erreurs et non pas (const sockaddr *) comme l a mentionné davwart sur ce site.

Commentaire de CptLuthor le 08/11/2004 15:51:14

salut
Moi je voudrai réaliser un client et un server VPN le plus simple possible, c a d je lance le server (un .exe tout petit) , mes pots lancent chacun le client ( un .exe tout petit )  et hop  on est connecté à distance et on se voit sur le réseau.

je précise je ne ve pas de service de messagerie, c a d je ve juste quon se voi en reseau comme ca on se voit dans les jeux comme si on été en reseau local.

voila merci à ce qui pourront maider

Commentaire de CptLuthor le 08/11/2004 15:52:07

salut
Moi je voudrai réaliser un client et un server VPN le plus simple possible, c a d je lance le server (un .exe tout petit) , mes pots lancent chacun le client ( un .exe tout petit )  et hop  on est connecté à distance et on se voit sur le réseau.

je précise je ne ve pas de service de messagerie, c a d je ve juste quon se voi en reseau comme ca on se voit dans les jeux comme si on été en reseau local.

voila merci à ce qui pourront maider

Commentaire de vbasicboy le 29/01/2005 02:40:15

moi sous FreeBSD et gcc c'est la merde total :)
server.c:12: error: syntax error before "le"
server.c: In function `main':
server.c:33: error: syntax error before "if"
server.c:36:3: warning: character constant too long for its type
server.c:36: error: syntax error before '\x75652063'
server.c: At top level:
server.c:42: error: syntax error before "saun"
server.c:42: warning: data definition has no type or storage class
server.c:43: error: syntax error before '.' token
server.c:43: warning: conflicting types for built-in function 'strcpy'
server.c:43: warning: data definition has no type or storage class
server.c:46: error: syntax error before string constant
server.c:48: error: `saun' undeclared here (not in a function)
server.c:48: error: initializer element is not constant
server.c:48: warning: data definition has no type or storage class
server.c:51: error: syntax error before "if"


hihihih help .....!!!!!!

Commentaire de Niouby le 22/03/2005 13:20:39

salut
voici les messages d'erreur à la compil :
client.c: Dans la fonction « main »:
client.c:43: attention : passage de l'argument n°2 de « connect » d'un type pointeur incompatible

et

server.c: Dans la fonction « main »:
server.c:47: attention : passage de l'argument n°2 de « bind » d'un type pointeur incompatible
server.c:62: attention : passage de l'argument n°2 de « accept » d'un type pointeur incompatible


l'execution ne pose cependant aucun probleme et les messages s'affiche correctement ....

PS : magnifique capture d'ecran LOL

Commentaire de heidern le 29/06/2005 14:16:11

j'apprecie particulierement ce code et je compte l'essayer tres prochainement.

Commentaire de bobobo le 26/01/2006 11:01:51

Salut,
Je trouve le code trés intéressant, mais ça serait pas mal de paufiner avant de poster...
Si davwart et joelemag c'était pas donné la peine de nous filer quelques corrections ça aurait été une source de moins !!
Bon aprés j'aime bien le côté court et ludique du programme.
Jo si tu as d'autres sources comme ça on est preneur :P

Commentaire de mehack le 15/09/2006 10:42:43

salut jo
stp tu px nous mettre ton prog en telechargement et met le en .exe
pour qu on puisse l essayer
il y a plein d erreur pendant la compilation il plente tjrs et d apres mes connaissances je crois que c parceque on a po les prototypes des fonctions (les fichiers .h)
normalement au moins tu dois les mettre en telechargement dans un zip comme ca c impossible d executer ton client et ton serveur..
et j tiens vraiment à essayer ton prog et à l modifier car c trers interessent
------------------------------|
pseudo : mehack               |
fonction : l aubergiste       |-----------
titre du site : lauberge du hacker perdu |
url : http://mehack.c.la                 |
lieu : devant mon ecran                  |-------------------|
signature : la vie est trop courte pour qu on la gaspille en boucle do while!!!!

Commentaire de projetf le 28/05/2007 16:52:15


oui mehack a raison le prg a lair bon ms il manque des trucs .il bug cher moi ossi !!!

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,983 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales