Client/serveur tcp, le serveur envoie au client son heure ou sa date [visual c++]

Soyez le premier à donner votre avis sur cette source.

Snippet vu 21 972 fois - Téléchargée 35 fois

Contenu du snippet

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 / Exemple :


/*************************************************************
			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.

A voir également

Ajouter un commentaire

Commentaires

nouroudz
Messages postés
1
Date d'inscription
mercredi 2 décembre 2009
Statut
Membre
Dernière intervention
2 décembre 2009
-
slt, j'ai besoin d'un code source pour les sockets sous windows dev_c++ de client/serveur
trig95
Messages postés
1
Date d'inscription
dimanche 18 mars 2007
Statut
Membre
Dernière intervention
18 mars 2007
-
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);

}
Dexter00
Messages postés
1
Date d'inscription
jeudi 23 décembre 2004
Statut
Membre
Dernière intervention
25 août 2006
-
Merci pour le code, tres utile ;)
darkkinj
Messages postés
18
Date d'inscription
samedi 6 novembre 2004
Statut
Membre
Dernière intervention
12 mars 2005
-
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é?
cs_Gabi
Messages postés
55
Date d'inscription
dimanche 10 février 2002
Statut
Membre
Dernière intervention
20 décembre 2005
-
y faut linker ws2_32.lib

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.