elbertondu62
Messages postés42Date d'inscriptionmercredi 17 novembre 2004StatutMembreDernière intervention22 janvier 2006
-
14 oct. 2005 à 21:05
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 2012
-
16 oct. 2005 à 00:07
Bonjour voila je suis entrain d'effectuer un programme avec winsock en
graphique mais j'ai un probleme arrivé sur une boucle d'ecoute. Quand
un client arrive elle doit sortir de celle ci. mais le probleme c'est
que cette fonction marche en mode console mais pas en graphique, sa
fait planter le programme!! la fonction que je parle est :
listen(idSocket,1);.
ban dans ma classe, j'ai crée une méthode pour pouvoir mettre soit TCP ou UDP dans la meme sa donne sa :
(je cherche apres l'icone pour inserer du code comme ds vb france mais je trouve pas ??? c'est où???)
SOCKET Cclassewinsock::UDPTCP(CString type)
{
iErreur=WSAStartup(MAKEWORD(2,0),&WSAData);//initialisation de winsock
Socketaddr_in.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");//adresse locale du serveur
Socketaddr_in.sin_family= AF_INET;
Socketaddr_in.sin_port=htons(1080);//valeur du port sur lequel on va ecouter
if(type=="SOCK_STREAM")
{
idSocket=socket(AF_INET,SOCK_STREAM,0);//creation du socket tcp
iErreur=100;//initialisation de erreur pour pouvoir entrer dans la boucle
while(iErreur!=0)//boucle tant qu'une session n'a pas été recu
iErreur=listen(idSocket,1); //pb ici qui fait planter le prog or qu'en
console sa marche
itemp=sizeof(InfosourceAccept);
idSocketEchange=accept(idSocket,(struct sockaddr*) &
InfosourceAccept,&itemp);//on accepte la connexion d'un client
}
else
{
idSocket=socket(AF_INET,SOCK_DGRAM,0);//creation du socket udp
}
iBind=bind(idSocket,(SOCKADDR *)&
Socketaddr_in,sizeof(Socketaddr_in));//lien entre socket et les info du
serveur
elbertondu62
Messages postés42Date d'inscriptionmercredi 17 novembre 2004StatutMembreDernière intervention22 janvier 2006 15 oct. 2005 à 12:57
j'ai trouver deja un pb, il fallait mettre bind avant que sa ne soit en
ecoute. Mais j'ai toujours un pb de plantage quand il arrive sur accept.
idSocketEchange=accept(idSocket,(struct sockaddr*) & InfosourceAccept,&itemp);//on accepte la connexion d'un client
La je ne sais pas pourquoi sa fait sa .... mais il reste bloqué là ce
qui est normal puisqu'il attend un client mais sa fait planter le prog
vous avez une proposition sur le pb???
idSocket=socket(AF_INET,SOCK_DGRAM,0);//creation du socket udp
}
}
return idSocket;
}
lorsque je fait un debug, celui-ci s'arrete sur
idSocketEchange=accept(idSocket,(struct sockaddr*) &
InfosourceAccept,&itemp);//on accepte la connexion d'un client.
Ce qui est normal puisqu'il attend la connexion d'un client. Cependant
le programme s'arrete ici et bloque. Quand je lance mon client je
n'arrive pas a me connecter sur le serveur.Et quand je vais voir le
serveur, celui-ci est planté.Aucune action est possible dessus.
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20124 15 oct. 2005 à 20:10
Salut,
Pour bind et listen, il ne faut pas faire de boucle: soit tout va bien
et les fonctions retournent 0, soit il y a un probleme et elles
retourent SOCKET_ERROR. Dans ce cas la, il faudrait afficher le numero
de l'erreur retourné par WSAGetLastError().
Meme remarque pour socket(), si la fonction retourne INVALID_SOCKET il faut afficher le numero de l'erreur.
le programme s'arrete, ce qui est normal puisqu'il attend un client.
Mais l'application se fige, je n'est plus acces a aucun bouton comme
quitter et l'application doit etre fermer avec ctrl alt suppr, chose
qui n'est pas normal car en mode console no probleme sur cette fonction.
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20124 15 oct. 2005 à 22:00
Salut,
Ah ben si tu n'es pas en console, c'est normal que l'application se
fige, car accept() bloque le thread, et donc les messages de ta fenetre
ne sont plus traités.
Pour resoudre ce probleme, soit tu peux utiliser accept() dans un
thread, soit tu peux utiliser les sockets non bloquants (sous windows
il y a le modele WSAAsyncSelect() qui est tres bien).
elbertondu62
Messages postés42Date d'inscriptionmercredi 17 novembre 2004StatutMembreDernière intervention22 janvier 2006 15 oct. 2005 à 23:17
Ok j'ai compris le principe du thread. J'ai trouvé sur le forum
l'utilisation de la fonction select() avant accept et autre comme recv.
Est ce que c'est une bonne idée ?
par contre pour les parametres a lui donner, je peut trouver sa sur la msdn ?
wazaaa breton
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20124 16 oct. 2005 à 00:07
Salut,
select() te permetra de gerer plusieurs sockets dans ton thread (celui
qui écoute et ceux de tes clients qui se connectent), mais tu n'es pas
obligé de l'utiliser.
Pour savoir comment utiliser select() tu peux lire le chapitre 5 de cet ebook: