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

cs_pheno Messages postés 141 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 23 mars 2005 - 13 mars 2003 à 21:05
nouroudz Messages postés 1 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 2 décembre 2009 - 2 déc. 2009 à 16:29
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/10551-client-serveur-tcp-le-serveur-envoie-au-client-son-heure-ou-sa-date-visual-c

nouroudz Messages postés 1 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 2 décembre 2009
2 déc. 2009 à 16:29
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
18 mars 2007 à 03:24
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
25 août 2006 à 19:42
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
17 janv. 2005 à 22:50
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
8 juil. 2004 à 01:30
y faut linker ws2_32.lib
drak_ ramore Messages postés 4 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 10 mars 2004
10 mars 2004 à 16:39
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
cs_Draven Messages postés 62 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 8 octobre 2006
13 juil. 2003 à 23:37
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';
glipper Messages postés 246 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 11 septembre 2016 1
13 juil. 2003 à 16:29
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 :(
glipper Messages postés 246 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 11 septembre 2016 1
13 juil. 2003 à 15:31
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
cs_Draven Messages postés 62 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 8 octobre 2006
13 juil. 2003 à 14:07
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.
glipper Messages postés 246 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 11 septembre 2016 1
13 juil. 2003 à 11:35
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
cs_Draven Messages postés 62 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 8 octobre 2006
10 juil. 2003 à 12:05
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 <<"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);
}
}
cs_Draven Messages postés 62 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 8 octobre 2006
10 juil. 2003 à 12: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 <<"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);
}
}
glipper Messages postés 246 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 11 septembre 2016 1
9 juil. 2003 à 14:01
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 <<"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 ?
ralary Messages postés 25 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 14 septembre 2007
8 mai 2003 à 13:06
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 ?
Cotsz Messages postés 1 Date d'inscription mercredi 2 avril 2003 Statut Membre Dernière intervention 6 avril 2003
6 avril 2003 à 14:26
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 ?
rastaangel Messages postés 1 Date d'inscription mercredi 26 mars 2003 Statut Membre Dernière intervention 26 mars 2003
26 mars 2003 à 22:28
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!!!
cs_zzzzzz Messages postés 408 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 18 décembre 2012
19 mars 2003 à 22:07
pas mal mais encor eplus expliqué sa serrai mieux!
Viper31 Messages postés 96 Date d'inscription mardi 2 avril 2002 Statut Membre Dernière intervention 7 août 2005
16 mars 2003 à 14:46
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 ^^ !
cs_Draven Messages postés 62 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 8 octobre 2006
16 mars 2003 à 14:30
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)
cs_Draven Messages postés 62 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 8 octobre 2006
15 mars 2003 à 16:07
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.
++
Viper31 Messages postés 96 Date d'inscription mardi 2 avril 2002 Statut Membre Dernière intervention 7 août 2005
15 mars 2003 à 13:49
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->sin_addr.s_addr,
host->h_addr,
host->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->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 !
cs_Cesar4 Messages postés 16 Date d'inscription mercredi 6 février 2002 Statut Membre Dernière intervention 18 juillet 2003
14 mars 2003 à 21:27
slt
Draven tu pourrait me donner la version linux?
++
cs_Draven Messages postés 62 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 8 octobre 2006
14 mars 2003 à 19:08
oui c vrai, pour linux j ai une autre version, si ca intersse du monde je peux la mettre en ligne.
cs_pheno Messages postés 141 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 23 mars 2005 1
13 mars 2003 à 21:05
il ne marche pas aussi sous linux (<winsock2.h> )
Rejoignez-nous