begin process at 2012 05 30 12:24:32
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Réseau / Internet

 > 

Winsock fonction listen qui bloque


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Winsock fonction listen qui bloque

vendredi 14 octobre 2005 à 21:05:32 | Winsock fonction listen qui bloque

elbertondu62

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
    return idSocket;
}

Merci bcp de votre aide

wazaaa breton
samedi 15 octobre 2005 à 12:57:44 | Re : Winsock fonction listen qui bloque

elbertondu62

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???

wazaaa breton
samedi 15 octobre 2005 à 16:25:46 | Re : Winsock fonction listen qui bloque

aardman

Membre Club
Salut,
Met le code, et sois plus précis que "ca fait planter le prog".
samedi 15 octobre 2005 à 17:41:55 | Re : Winsock fonction listen qui bloque

elbertondu62

voila ma methode tcp, qui gere le client et le serveur a la fois:
SOCKET Cclassewinsock::UDPTCP(CString type, int temp)
{
    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(temp==0)//ici on test si on a demander d'etre serveur
    {
        if(type=="SOCK_STREAM")
        {
            idSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//creation du socket tcp
            iErreur=100;//initialisation de erreur pour pouvoir entrer dans la boucle
            iBind=bind(idSocket,(SOCKADDR *)& Socketaddr_in,sizeof(Socketaddr_in));//lien entre socket et les info du serveur
            while(iErreur!=0)//boucle tant qu'une session n'a pas été recu
                iErreur=listen(idSocket,1);
            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
        }
    }
    else//ici c'est la parti cliente
    {
        if(type=="SOCK_STREAM")
        {
            idSocket=socket(AF_INET,SOCK_STREAM,0);//creation du socket
            iErreur=connect(idSocket,(struct sockaddr*)&InfosourceAccept,sizeof(InfosourceAccept));
        }
        else
        {
            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.

wazaaa breton
samedi 15 octobre 2005 à 19:21:27 | Re : Winsock fonction listen qui bloque

MrdJack

Salut, je pense qu'il faut d'abord fermer le sock avant d'accepter.
comme dans vb !



samedi 15 octobre 2005 à 20:10:47 | Re : Winsock fonction listen qui bloque

aardman

Membre Club
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.

samedi 15 octobre 2005 à 20:28:14 | Re : Winsock fonction listen qui bloque

elbertondu62

C'est ce qu ej'ai fait dans ma partie graphique. Si iErreur est different de 0 alors il faut dire le pb...
Ensuite pour les boucle ok j'ai virer la boucle pour le listen.
Ensuite pour mon accept le probleme est toujours la.
Mais il faut que je ferme le socket comme la dit MrdJack??? avant de faire accept?

wazaaa breton
samedi 15 octobre 2005 à 21:29:45 | Re : Winsock fonction listen qui bloque

aardman

Membre Club
Salut,
et alors ? tu obtiens quoi comme erreur, et a quelle fonction ?

samedi 15 octobre 2005 à 21:55:47 | Re : Winsock fonction listen qui bloque

elbertondu62

a la fonction accept :
idSocketEchange=accept(idSocket,(struct sockaddr*) & InfosourceAccept,&itemp);
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.

wazaaa breton
samedi 15 octobre 2005 à 22:00:41 | Re : Winsock fonction listen qui bloque

aardman

Membre Club
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).

1 2

Cette discussion est classée dans : winsock, socket, in, idsocket, socketaddr


Répondre à ce message

Sujets en rapport avec ce message

Winsock simple... [ par DeAtHCrAsH ] Comment faire pour que le serveur puisse gerer plusieurs client a la fois ?Dois-je declarer autant de socket qu'il y a de client ?Ou y a t'il un equiv Socket pb avec send [ par edpunisher ] kikoo voici mon code client et server mais bon dieu pourkoi je recois pas le fameux hello world NB:y as pas d erreur de connexion     le server est su Besoin Aide (Client PHP/Serveur C++) [ par qbasic ] slt bien a vous je suis en train de coder un serveur en c++ socket en protocole tcp et un client en php C++LE SERVEUR C++ : #include #includ [GRAVE]!! TOUTES MES APPLI winsock marche pu [ par sebastienmz ] Salut tout le mondeje suis devant un cas assé dure :ce matin je démare mon pc.. le lance mon google search (la source que j'ai posté) et la imppossibl EVENEMENTS WINSOCK [ par DeAtHCrAsH ] Quelqu'un aurait il une liste detaillé des differents evenements mis en place pour mes socket ? (WM_SOCKET)Et sans MFC ou VCL !Du genre l'evenement qu Cherche socket.h, in.h et inet.h [ par masdacre ] Bonjour Je cherche ces trois librairies : sys/socket.h netinet/in.h arpa/inet.h Je sais qu'elles sont normalement utilisées sous linux mais j'en ai b Cours sur Winsock [ par Tibabou ] Bonjour/soir,   Je suis à la recherche de cours au sujet de Winsock ou d'un moyen de faire communiquer x PCs en réseau local ou via le net. (j'ai pas pb connexion socket [ par skyman272 ] BonjourJ'essaye de faire marcher le programme source qui est sur ce site : http://www.cppfrance.com/code.aspx?ID=29687Je lance le serveur principal et Winsock, problèmes via internet [ par Tibabou ] Bonjour/soir,   J'ai fait un petit programme (client/serveur) avec winsock. Il fonctionne en réseau local. Lorsque je rentre l'IP d'un site internet a ordinal 5077 [ par hhhp2004 ] hhhp2004salut,je debute en visual c++ et je lis un livre : sams teach yourself visual c++ in 21 days.dans le premier jour , il faut creer un MFCappWiz


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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 : 0,827 sec (4)

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