begin process at 2010 02 10 03:32:35
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > CLIENT/SERVEUR TCP, LE SERVEUR ENVOIE AU CLIENT SON HEURE OU SA DATE [VISUAL C++]

CLIENT/SERVEUR TCP, LE SERVEUR ENVOIE AU CLIENT SON HEURE OU SA DATE [VISUAL C++]


 Information sur la source

Note :
8,5 / 10 - par 8 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseaux & Internet Niveau :Initié Date de création :13/03/2003 Date de mise à jour :16/03/2003 16:32:38 Vu :16 058

Auteur : Draven

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

 Description

Ce code est un client/serveur TCP sous windows, le client tape"heure" pour connaitre l'heure du serveur ou "date" pour connaitre la date. Sur le serveur on peut selectionner le n° de port qui servira de serveur, et sur le client on configure l'adresse ip du serveur et le n°de port.
biensur cela n'a pas grand interet, mais c'est juste pour montrer comment effectuer des communication client/serveur.Vous pouvez l'utiliser pour tout autre chose il suffit de modifier les codes se trouvant dans les fonction traitement().    

Source

  • /*************************************************************
  • LE SERVEUR
  • **************************************************************/
  • #include <stdio.h>
  • #include <winsock2.h>
  • #include <string.h>
  • #include <time.h>
  • #pragma comment(lib, "ws2_32.lib")
  • #define LG_MAX_REQUETE 1024
  • void traitement(SOCKET);
  • void main()
  • {
  • int val,port=0,erreur;
  • WSADATA wsa;
  • /* initialisation */
  • WSAStartup(MAKEWORD(2,0), &wsa);
  • SOCKET serveur;
  • SOCKET client;
  • SOCKADDR_IN sin;
  • SOCKADDR_IN clientsin;
  • /* saisir la configuration du serveur */
  • printf("Entrez le numero de port: ");
  • scanf("%d",&port);
  • /* creation de la socket serveur */
  • serveur=socket(AF_INET,SOCK_STREAM,0);
  • if(serveur==INVALID_SOCKET)
  • {
  • perror("erreur de creation de la socket");
  • exit(-1);
  • }
  • /* configuration de la socket */
  • sin.sin_addr.s_addr = INADDR_ANY;
  • sin.sin_family = AF_INET;
  • sin.sin_port = htons(port);
  • /* attacher le socket au n° de port*/
  • erreur=bind(serveur,(SOCKADDR *)&sin, sizeof(sin));
  • if(erreur == INVALID_SOCKET)
  • {
  • perror("bind");
  • exit(-1);
  • }
  • /* creation d'une file d'attente de demande de connexion */
  • listen(serveur,0);
  • val=sizeof(clientsin);
  • printf("\n\tServeur en route\n");
  • while(1)
  • {
  • /* accepter une connexion */
  • client=accept(serveur,(SOCKADDR *)&clientsin,&val);
  • if(client == INVALID_SOCKET)
  • {
  • perror("erreur de connection");
  • exit(-1);
  • }
  • /* fonction qui utilise la socket */
  • traitement(client);
  • }
  • }
  • /**************************************************************
  • traitement
  • traite la requete envoyer par le client
  • **************************************************************/
  • void traitement(SOCKET client)
  • {
  • int lg,comparaison;
  • char reponse[LG_MAX_REQUETE],date[10],heure[10];
  • /* attendre la reception d'une requete sur la socket "client" */
  • lg=recv(client,reponse,LG_MAX_REQUETE,0);
  • reponse[lg]='\0';
  • comparaison=strcmp(reponse,"date");
  • if(comparaison==0)
  • {
  • _strdate(date);
  • sprintf(reponse, "Date du serveur: %s\n",date);
  • }
  • comparaison=strcmp(reponse,"heure");
  • if(comparaison==0)
  • {
  • _strtime(heure);
  • sprintf(reponse, "Heure du serveur: %s\n",heure);
  • }
  • lg=strlen(reponse);
  • /* envoyer une requete sur la socket "client" */
  • send(client,reponse,lg,0);
  • }
  • /**************************************************************
  • LE CLIENT
  • **************************************************************/
  • #include <stdio.h>
  • #include <string.h>
  • #include <winsock2.h>
  • #pragma comment(lib, "ws2_32.lib")
  • #define LG_MAX_REQUETE 1024
  • void traitement(SOCKET);
  • void main()
  • {
  • int port=0,erreur;
  • struct hostent *nom_serveur;
  • char ad_serveur[255];
  • WSADATA wsa;
  • /* initialisation */
  • WSAStartup(MAKEWORD(2,0), &wsa);
  • SOCKET client;
  • SOCKADDR_IN sin;
  • /* saisir la configuration du client */
  • printf("Entrez l'adresse du serveur :");
  • scanf("%s",ad_serveur);
  • printf("Entrez le numero de port: ");
  • scanf("%d",&port);
  • nom_serveur=gethostbyname(ad_serveur);
  • if(nom_serveur==NULL)
  • {
  • perror("adresse non valide");
  • exit(-1);
  • }
  • /* creation de la socket client */
  • client = socket(AF_INET,SOCK_STREAM,0);
  • if(client==INVALID_SOCKET)
  • {
  • perror("erreur de creation de la socket");
  • exit(-1);
  • }
  • /* configuration de la socket */
  • memcpy(&sin.sin_addr,nom_serveur->h_addr,nom_serveur->h_length);
  • sin.sin_family = AF_INET;
  • sin.sin_port = htons(port);
  • /* connecter le client au serveur */
  • erreur=connect(client, (SOCKADDR *)&sin, sizeof(sin));
  • if(erreur==INVALID_SOCKET)
  • {
  • perror("erreur de connexion");
  • exit(-1);
  • }
  • /* fonction qui utilise la socket */
  • traitement(client);
  • /* fermer le socket */
  • closesocket(client);
  • WSACleanup();
  • }
  • /************************************************************************************
  • traitement
  • taper heure pour avoir l'heure du serveur, ou date pour obtenir la date du serveur
  • *************************************************************************************/
  • void traitement(SOCKET client)
  • {
  • int lg;
  • char requete[LG_MAX_REQUETE];
  • printf("ca marche?\n");
  • scanf("%s",requete);
  • lg=strlen(requete);
  • send(client,requete,lg,0);
  • lg=recv(client,requete,LG_MAX_REQUETE,0);
  • requete[lg]='\0';
  • printf("%s",requete);
  • system("PAUSE");
  • }
/*************************************************************
			LE SERVEUR
**************************************************************/
#include <stdio.h>
#include <winsock2.h>
#include <string.h>
#include <time.h>

#pragma comment(lib, "ws2_32.lib")

#define LG_MAX_REQUETE 1024

void traitement(SOCKET);

void main()
{
	int val,port=0,erreur;

	WSADATA wsa;
	/* initialisation */
	WSAStartup(MAKEWORD(2,0), &wsa);
	
	SOCKET serveur;
	SOCKET client;
	SOCKADDR_IN sin;
	SOCKADDR_IN clientsin;
	/* saisir la configuration du serveur */
	printf("Entrez le numero de port: ");
	scanf("%d",&port);  

	/* creation de la socket serveur */
	serveur=socket(AF_INET,SOCK_STREAM,0);
	if(serveur==INVALID_SOCKET)
	{
		perror("erreur de creation de la socket");
		exit(-1);
	}
	/* configuration de la socket */
	sin.sin_addr.s_addr = INADDR_ANY;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(port);

	/* attacher le socket au n° de port*/
	erreur=bind(serveur,(SOCKADDR *)&sin, sizeof(sin));
	if(erreur == INVALID_SOCKET)
	{
		perror("bind");
		exit(-1);
	}
	/* creation d'une file d'attente de demande de connexion */
	listen(serveur,0);
	val=sizeof(clientsin);
	printf("\n\tServeur en route\n");
	while(1)
	{	
		/* accepter une connexion */
		client=accept(serveur,(SOCKADDR *)&clientsin,&val);
		if(client == INVALID_SOCKET)
		{
			perror("erreur de connection");
			exit(-1);
		}
		/* fonction qui utilise la socket */
		traitement(client);
	}
}
/**************************************************************
			traitement
	               traite la requete envoyer par le client
**************************************************************/

void traitement(SOCKET client)
{
	int lg,comparaison;
	char reponse[LG_MAX_REQUETE],date[10],heure[10];
	/* attendre la reception d'une requete sur la socket "client" */
	lg=recv(client,reponse,LG_MAX_REQUETE,0);
	reponse[lg]='\0';
	comparaison=strcmp(reponse,"date");
	if(comparaison==0)
	{
		_strdate(date);
		sprintf(reponse, "Date du serveur: %s\n",date);
	}
	comparaison=strcmp(reponse,"heure");
	if(comparaison==0)
	{
		_strtime(heure);
		sprintf(reponse, "Heure du serveur: %s\n",heure);
	}
	lg=strlen(reponse);
	/* envoyer une requete sur la socket "client" */
	send(client,reponse,lg,0);
}



/**************************************************************
			LE CLIENT
**************************************************************/
#include <stdio.h>
#include <string.h>
#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

#define LG_MAX_REQUETE 1024

void traitement(SOCKET);

void main()
{
	int port=0,erreur;
	struct hostent *nom_serveur;
	char ad_serveur[255];

	WSADATA wsa;
	/* initialisation */
	WSAStartup(MAKEWORD(2,0), &wsa);

	SOCKET client;
	SOCKADDR_IN sin;

	/* saisir la configuration du client */
	printf("Entrez l'adresse du serveur :");
	scanf("%s",ad_serveur);
	printf("Entrez le numero de port: ");
	scanf("%d",&port);
	
	nom_serveur=gethostbyname(ad_serveur);
	if(nom_serveur==NULL)
	{
		perror("adresse non valide");
		exit(-1);
	}
 
	/* creation de la socket client */
	client = socket(AF_INET,SOCK_STREAM,0);
	if(client==INVALID_SOCKET)
	{
		perror("erreur de creation de la socket");
		exit(-1);
	}
	
	/* configuration de la socket */
	memcpy(&sin.sin_addr,nom_serveur->h_addr,nom_serveur->h_length);
	sin.sin_family = AF_INET;
	sin.sin_port = htons(port);
	/* connecter le client au serveur */
	erreur=connect(client, (SOCKADDR *)&sin, sizeof(sin));
	if(erreur==INVALID_SOCKET)
	{
		perror("erreur de connexion");
		exit(-1);
	}
	/* fonction qui utilise la socket */
	traitement(client);
	/* fermer le socket */
	closesocket(client);
	WSACleanup();
}

/************************************************************************************
									traitement
 taper heure pour avoir l'heure du serveur, ou date pour obtenir la date du serveur
*************************************************************************************/

void traitement(SOCKET client)
{
	int lg;
	char requete[LG_MAX_REQUETE];
	
	printf("ca marche?\n");

	scanf("%s",requete);
	lg=strlen(requete);
	send(client,requete,lg,0);
	lg=recv(client,requete,LG_MAX_REQUETE,0);
	requete[lg]='\0';
	printf("%s",requete);
	system("PAUSE");
}  

 Conclusion

Ce prog marche sous visual c++ 6, mais pas sous borland c++ 5.02. Pour les autre compilateur je ne sais pas.    


 Sources du même auteur

Source avec Zip Source avec une capture TESTER VOTRE RAPIDITÉ À CLIQUER [BUILDER]
Source avec Zip APPLIQUER UN FILTRE À UNE IMAGE
CONVERTIR UNE IMAGE 16 MILLIONS DE COULEURS EN NIVEAUX DE GR...
Source avec Zip THREADS SOUS BUILDER
STÉGANOGRAPHIE [BORLAND C++]

 Sources de la même categorie

Source avec Zip TIM_RESEAU, CLASSES POUR RESEAU COMPLET par williamallas
Source avec Zip INTERNET IP FINDER TROUVER VOS ADRESSE IP (INTERNET) par xmustapha
Source avec Zip CLIENT/SERVEUR AVEC TSOCKETSERVER & TCLIENTSOCKET par xmustapha
Source avec Zip REMOTE SHELL GEN par ganjarasta
PROXY IRC SIMPLE (WINDOWS/WINSOCK) par _michel

Commentaires et avis

Commentaire de pheno le 13/03/2003 21:05:51

il ne marche pas aussi sous linux (&lt;winsock2.h&gt; )

Commentaire de Draven le 14/03/2003 19:08:13

oui c vrai, pour linux j ai une autre version, si ca intersse du monde je peux la mettre en ligne.

Commentaire de Cesar4 le 14/03/2003 21:27:31

slt
Draven tu pourrait me donner la version linux?
++

Commentaire de Viper31 le 15/03/2003 13:49:12

Salut , je te felicite pour ta source ! mais j aurai un chtite question et une remarque par rapport a ta source ! tu ne gere que les ips ?? t'aurai pas un bout de code pour resoudre les nom de domaine de facon non bloquante ?? si ca t interesse j'ai une version bloquante d'une resolution de nom , qui marche avec les nom de machine en reseau local , mais a la facheuse mani de planter si il trouve pas le nom de domaine (forcement c'est bloquant !!). voici la source :

struct hostent *resolve(SOCKADDR_IN *sockin, char adresse[]) {
    struct hostent *host;
    host = gethostbyname(adresse);
    memcpy((char *)&sockin-&gt;sin_addr.s_addr,
        host-&gt;h_addr,
        host-&gt;h_length);
    return host;
}

a utiliser comme ca :
main() {
.
.
.

struct hostent *host;
struct in_addr **a;
char req_host[255];

printf("Entrer l'Adresse(DNS) de l'hote : ");
scanf("%s",req_host);

if((host=resolve(&sockin,req_host))!=NULL) {
printf("DNS resolu ...
");
for (a=(struct in_addr **)host-&gt;h_addr_list; *a; a++) {
    printf("Address: %s
", inet_ntoa(**a));
}
printf("
");
}

.
.
.
}

mais ca a donc l inconveniant de merder si li trouve pas :/

si quelqu'un a une solution avec des nom bloquant , car moi je bloque la !

Commentaire de Draven le 15/03/2003 16:07:00

je te remercie pour ton code Viper31. je vais y jete un coup d oeil et essayer de voir si je trouve une solution.

et pour la version Unix, j ai parler un peu trop vite j ai plus la source, mais je vais m'y remettre des que j aurai fini le prog que je suis en train de faire.
++

Commentaire de Draven le 16/03/2003 14:30:57

mise a jour pour se connecter en entrant l adresse du serveur et plus son ip. ceci est possible grace a l'instruction gethostbyname(adresse du serveur)

Commentaire de Viper31 le 16/03/2003 14:46:19

J'ai compris ce qui merdé dans mon code , c que si gethostbyname n'a pas pu resoudre le nom de domaine , donc faut que tu fasses un test sur "nom_serveur" , car il vaut NULL si il a pas reussi ! donc tu fais un truc style :

if (!(nom_serveur=gethostbyname(ad_serveur))) return 0;

faut que ton main renvoie un int , avec ca en plus , si il resout pas le nom de domaine , le programme s arrete tout simplement.

Parce que le probleme , c que si il arrive pas a resoudre le nom de domaine , tu fais un memcpy avec un pointeur NULL qui fait planter ton programme , donc le if tout con permet d eviter ca !

voila voila ^^

P.S. : rajoute aussi return 1; a la fin de ton main du coup ^^ !

Commentaire de zzzzzz le 19/03/2003 22:07:42

pas mal mais encor eplus expliqué sa serrai mieux!

Commentaire de rastaangel le 26/03/2003 22:28:22

salut vous avez parlé d'une version pour linux. porrais je l'avoir si c'est possible?
     de plus avec visual c++6 lorsque je compile j'obtient un grand nombres d'erreurs,surment du au fait qu'il ne reconnait pas SOCKET, savez vous pouquoi?
                                  merci d'avance ,je suis un peu perdu!!!

Commentaire de Cotsz le 06/04/2003 14:26:51

Pour ma part pas de probleme avec VC++ 6.0
tu as mis a jour avec le SP5 ?
Tu compile bien separement le client et le serveur ?

Commentaire de ralary le 08/05/2003 13:06:44

je veux debuter en reseaux mais est ce que c'est realisable avec  lcc win32?
et donne moi un indice par ou commencer la programmation ?

Commentaire de glipper le 09/07/2003 14:01:48

Bonjour,
j'ai essayé ce code... (je l'ai un peu modifier, mais tres peu). J'ai surtout changé le while(1) du serveur :

[b]
while(1)
{  
SOCKET client = accept(sock,(SOCKADDR *)&clientsin,&val);
if(client == INVALID_SOCKET)
  cout &lt;&lt;"erreur de connection
";
else
{
char reponse[1024];
int lg = recv(client, reponse, 1024, 0);
reponse[lg]='';
if (!strcmp(reponse,"com1"))
send(client,"iop",3,0);
else
send(client,"commande inconue",sizeof("commande inconue"),0);
}
}[/b]

et j'ai un probleme : lorsque j'execute une premiere commande (par exemple je tape 'com1'), ca marche, mais ensuite koi que je tape, le serveur ne repond plus...
Quelqu'un aurait une idée de l'endroit ou j'ai pu me tromper ?

Commentaire de Draven le 10/07/2003 12:01:01

voila ce que j ai modifie, chez moi ca marche.
1°/ mettre les declarations des variables en debut de programme ( + propres
SOCKET client ;
char reponse[1024];
int lg;
...
while(1)
{  
SOCKET client = accept(sock,(SOCKADDR *)&clientsin,&val);
if(client == INVALID_SOCKET)
  cout &lt;&lt;"erreur de connection ";
else
{
char reponse[1024];
int lg = recv(client, reponse, 1024, 0);
reponse[lg]='';
if (!strcmp(reponse,"com1"))
send(client,"iop",3,0);
else
send(client,"commande inconue",sizeof("commande inconue"),0);
}
}

Commentaire de Draven le 10/07/2003 12:05:44

oups désolé pour la fausse manip.

voila ce que j ai modifie, chez moi ca marche.
1°/ mettre les declarations des variables en debut de programme ( + propres
2°/ le '' pour symbolise la fin de la chaine de caracteres
3°/ dans le accept j ai changé 'sock' par 'serveur'. dans t as du oublié de le modifier

SOCKET client ;
char reponse[1024];
int lg;
...
while(1)
{  
        client = accept(serveur,(SOCKADDR *)&clientsin,&val);
        if(client == INVALID_SOCKET)
             cout &lt;&lt;"erreur de connection ";
        else
        {
            lg = recv(client, reponse, 1024, 0);
            reponse[lg]='';
            if (!strcmp(reponse,"com1"))
                send(client,"iop",3,0);
            else
                send(client,"commande inconue",sizeof("commande inconue"),0);
         }
}

Commentaire de glipper le 13/07/2003 11:35:34

Bon bin je sais pas si c'est bien, mais pour le faire marcher, j'ai été obligé de mettre le 'client = accept(serveur,(SOCKADDR *)&clientsin,&val);' avant le while du coté serveur...
Alors je sais pas si ca pose des problemes pour la securité ou quelquechose du genre, mais sinon ca ne marche qu'une fois :)
Glipper

ps : le '' ne marche pas... mais ce qu'il tu avais mis avant '' marche par contre

++ Glipper

Commentaire de Draven le 13/07/2003 14:07:26

petite erreur. j ai oublier de completer l'interieur des ''.

donc voila la correction:
reponse[lg]='';


par contre je comprends pas comment ca peut fonctionner plusieurs fois si tu mets le accept() en dehors du while. car une fois dans la boucle tu ne peux plus accepter la connection d'un client. Deplus la socket "client" ne sera pas initialisé pour ce client.

Commentaire de glipper le 13/07/2003 15:31:08

Bon ben alors une autre solution qui marche (c'est peut etre comme ca qu'il faut faire, mais je trouve ca assez bourrin) : cette fois, il s'agit du coté client : on se reconnecte à chaque commande que l'on envoie, ou que l'on recoit.
En gros, je met ma boucle while du coté client juste avant la creation du socket ?
Ca marche aussi, mais ca doit rallentir beaucoup je pense nan ?
Glipper

Commentaire de glipper le 13/07/2003 16:29:13

Mais du coup, j'ai un autre probleme qui se pose lool
Si je veux me connecter a un serveur ftp, où il faut entrer un login, puis un mot de pass... si je me deconnecte entre chaque envoi d'information, il redemande infiniment de taper le login :(
J'ai trouvé un moyen plus simple en fait d'expliquer mon probleme de depart:
si l'on recupere le code de base (en haut de la page), et que l'on reappelle deux fois la fonction "traitement()" du coté client, elle ne marche plus la deuxieme fois. L'exemple en haut n'est prévu que pour demander une seule et unique information, mais des que j'essaie d'en demander deux, ca ne marche plus :(

Commentaire de Draven le 13/07/2003 23:37:48

ce n est pas une bonne solution car tu ne respectes plus le principe d un client serveur tcp.

je viens de m apercevoir que le caractere que je met entre les '' n'apparait pas. il s'agit en fait du caractere zero. (biensur zero en chiffre et pas en lettre) donc ca donne:

reponse[lg]='zero';

Commentaire de drak_ ramore le 10/03/2004 16:39:20

slt

j'ai un probleme de linkage pendant la compilation :

Compiling...
Serveur.cpp
Linking...
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/Client.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

Client.exe - 2 error(s), 0 warning(s)

????????????????

si quelqu'un pouvait m'aider.

merci d'avance

Commentaire de Gabi le 08/07/2004 01:30:42

y faut linker ws2_32.lib

Commentaire de darkkinj le 17/01/2005 22:50:47

Petit problème. Si ont veux utiliser l'application sur un poste ne disposant pas d'un compilateur, le programme plante. Ya-til des dll a copier ou quelque chose comme ca?
ou bien on ne pourras jamais utiliser un programme sans compilateur à coté?

Commentaire de Dexter00 le 25/08/2006 19:42:38

Merci pour le code, tres utile ;)

Commentaire de trig95 le 18/03/2007 03:24:22

Bonjour,
voila j'ai un ptit souci en voulant y mettre un jeu de devinette aukel le server choisi un nombre au hasard et le client essaye de le deviner. Alors + precisement mon probleme est k'apres que le client fait une premiere tentative je n'arrive pas a faire en sorte a ce que le clien puisse reessayer, cela me bloque apres la validation du premier essai. Voila ce que j'ai modifier dans le parti server only:
...
traitement(client, i);
}
}
void traitement(SOCKET client, int i)
{
int lg, nb,nb_essai=0;
char reponse[LG_MAX_REQUETE];
lg=recv(client,reponse,LG_MAX_REQUETE,0);
reponse[lg]='\0';
nb=atoi(reponse);
nb_essai++;
if(nb < i)
{
printf("trop petit\n");
}
if(nb > i)
{
printf("trop grand\n");
}
while (nb!=i);
return;
if(nb==i)
{printf("Bingo vous avez trouvez en %d essais\\n",nb_essai);
}



lg=strlen(reponse);
/* envoyer une requete sur la socket "client" */
send(client,reponse,lg,0);

}

Commentaire de nouroudz le 02/12/2009 16:29:13

slt, j'ai besoin d'un code source pour les sockets sous windows dev_c++ de client/serveur

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix


HTC Magic

Entre 429€ et 429€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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 : 1,061 sec (4)

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