CLIENT/SERVEUR TCP, LE SERVEUR ENVOIE AU CLIENT SON HEURE OU SA DATE [VISUAL C++
cs_pheno
Messages postés141Date d'inscriptionmardi 30 avril 2002StatutMembreDernière intervention23 mars 2005
-
13 mars 2003 à 21:05
nouroudz
Messages postés1Date d'inscriptionmercredi 2 décembre 2009StatutMembreDerniè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.
nouroudz
Messages postés1Date d'inscriptionmercredi 2 décembre 2009StatutMembreDerniè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és1Date d'inscriptiondimanche 18 mars 2007StatutMembreDernière intervention18 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és1Date d'inscriptionjeudi 23 décembre 2004StatutMembreDernière intervention25 août 2006 25 août 2006 à 19:42
Merci pour le code, tres utile ;)
darkkinj
Messages postés18Date d'inscriptionsamedi 6 novembre 2004StatutMembreDernière intervention12 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és55Date d'inscriptiondimanche 10 février 2002StatutMembreDernière intervention20 décembre 2005 8 juil. 2004 à 01:30
y faut linker ws2_32.lib
drak_ ramore
Messages postés4Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention10 mars 2004 10 mars 2004 à 16:39
slt
j'ai un probleme de linkage pendant la compilation :
cs_Draven
Messages postés62Date d'inscriptiondimanche 22 octobre 2000StatutMembreDerniè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és246Date d'inscriptiondimanche 2 juin 2002StatutMembreDernière intervention11 septembre 20161 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és246Date d'inscriptiondimanche 2 juin 2002StatutMembreDernière intervention11 septembre 20161 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és62Date d'inscriptiondimanche 22 octobre 2000StatutMembreDerniè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és246Date d'inscriptiondimanche 2 juin 2002StatutMembreDernière intervention11 septembre 20161 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és62Date d'inscriptiondimanche 22 octobre 2000StatutMembreDerniè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
cs_Draven
Messages postés62Date d'inscriptiondimanche 22 octobre 2000StatutMembreDerniè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és246Date d'inscriptiondimanche 2 juin 2002StatutMembreDernière intervention11 septembre 20161 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és25Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention14 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és1Date d'inscriptionmercredi 2 avril 2003StatutMembreDerniè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és1Date d'inscriptionmercredi 26 mars 2003StatutMembreDernière intervention26 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és408Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention18 décembre 2012 19 mars 2003 à 22:07
pas mal mais encor eplus expliqué sa serrai mieux!
Viper31
Messages postés96Date d'inscriptionmardi 2 avril 2002StatutMembreDerniè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és62Date d'inscriptiondimanche 22 octobre 2000StatutMembreDerniè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és62Date d'inscriptiondimanche 22 octobre 2000StatutMembreDerniè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és96Date d'inscriptionmardi 2 avril 2002StatutMembreDerniè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 :
2 déc. 2009 à 16:29
18 mars 2007 à 03:24
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);
}
25 août 2006 à 19:42
17 janv. 2005 à 22:50
ou bien on ne pourras jamais utiliser un programme sans compilateur à coté?
8 juil. 2004 à 01:30
10 mars 2004 à 16:39
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
13 juil. 2003 à 23:37
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';
13 juil. 2003 à 16:29
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 :(
13 juil. 2003 à 15:31
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
13 juil. 2003 à 14:07
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.
13 juil. 2003 à 11:35
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
10 juil. 2003 à 12:05
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);
}
}
10 juil. 2003 à 12:01
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);
}
}
9 juil. 2003 à 14:01
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 ?
8 mai 2003 à 13:06
et donne moi un indice par ou commencer la programmation ?
6 avril 2003 à 14:26
tu as mis a jour avec le SP5 ?
Tu compile bien separement le client et le serveur ?
26 mars 2003 à 22:28
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!!!
19 mars 2003 à 22:07
16 mars 2003 à 14:46
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 ^^ !
16 mars 2003 à 14:30
15 mars 2003 à 16:07
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.
++
15 mars 2003 à 13:49
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 !
14 mars 2003 à 21:27
Draven tu pourrait me donner la version linux?
++
14 mars 2003 à 19:08
13 mars 2003 à 21:05