begin process at 2012 05 29 22:09:09
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

API

 > 

probleme socket + API ( +thread ?)


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

probleme socket + API ( +thread ?)

jeudi 27 avril 2006 à 16:15:13 | probleme socket + API ( +thread ?)

lolorenzeb

Bonjour à tous,

Voila j'avais deja poster dans un précédent sujet mais comme j'ai revu tout mon code cela va etre plus simple de répondre. J'ai donc créer une application réseau (graphique) qui créer une socket et qui se met en écoute en attente d'une connexion.

Mon probleme est que lorsque je clique sur mon bouton pour que l'appli se mette en écoute, la fenetre se fige et ensuite plante.  Le problème vient du fait que j'ai une boucle pour actualiser l'affichage dans "WinMain" ce qui est logique, et une autre qui permet au prog d'etre en écoute (dans la procedure "create_connexion"). Donc lorsque le prog se met en écoute il se bloque dans la boucle d'ecoute et l'affichage ne se fait plus et tout plante.
J'ai entendu vaguement parler des "thread" d'ou le ? dans le titre du sujet mais je ne sais pas du tout m'en servir et je ne suis pas sur non plus que cela règle mon problème.

Si quelqu'un a une idée... Merci d'avance et désolé pour le roman :)


Voila mon code:

/****************BOUCLE PRINCIPALE**************************/
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){


        MSG msg; //récupère les messages de windows

        //crée la fenetre
        hwnd = CreateWnd(hInstance);
        ShowWindow (hwnd, iCmdShow);
        //crée un bouton Connexion
        hBoutonConnect = CreateWindow("button", "Lancer", WS_CHILD | WS_BORDER, 95, 30, 90, 20, hwnd, 0, hInstance, 0);
        ShowWindow(hBoutonConnect, iCmdShow);
        //crée un bouton Quitter
        hBoutonQuit = CreateWindow("button", "Quitter", WS_CHILD | WS_BORDER, 10, 60, 175, 20, hwnd, 0, hInstance, 0);
        ShowWindow(hBoutonQuit, iCmdShow);
        //raffraichit la fenetre
        UpdateWindow (hwnd);
    
    //---------Boucle d'affichage---------------------
     while (GetMessage (&msg, NULL, 0, 0)){
          TranslateMessage (&msg);
          DispatchMessage (&msg);
     }
     return msg.wParam;
}
/************FIN DE LA BOUCLE PRINCIPALE*****************/


/******************CREATION DE LA FENETRE*******************/
HWND CreateWnd(HINSTANCE hInst){
 code ........
}
/***************FIN CREATION DE LA FENETRE*****************/


/*********************CLIENT***************************/
void create_connexion(){

    int port=0,erreur;
 
    WSADATA wsa;
    /* initialisation */
    WSAStartup(MAKEWORD(2,0), &wsa);
       
        //variables pour la connexion réseau
        SOCKET serveur;
        SOCKET client;
        SOCKADDR_IN sin;
        SOCKADDR_IN clientsin;
 
    /* creation de la socket serveur */
    serveur  = socket(AF_INET,SOCK_STREAM,0);
    if(serveur == INVALID_SOCKET){
        MessageBox (NULL, "Impossible de créer la socket", "Client", MB_OK | MB_ICONEXCLAMATION);
        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){
        MessageBox (NULL, "Impossible d'ouvrir le port", "Client", MB_OK | MB_ICONEXCLAMATION);
        exit(-1);
    }
    /* creation d'une file d'attente de demande de connexion */
    listen(serveur,0);
    MessageBox (NULL, "Client en écoute", "Client", MB_OK | MB_ICONEXCLAMATION);

        int val = sizeof(clientsin);


        //---------Boucle d'écoute---------------------
        while (client = accept(serveur,(SOCKADDR *)&clientsin,&val)){
       
            /* accepter une connexion */   
            if(client == INVALID_SOCKET)
                MessageBox (NULL, "Erreur de connexion", "Client", MB_OK | MB_ICONEXCLAMATION);
            else
                MessageBox (NULL, "Serveur connecter", "Client", MB_OK | MB_ICONEXCLAMATION);
                /* fonction qui utilise la socket */
                traitement(client);
        }
 
}
/*********************FIN CLIENT*************************/


/*********************TRAITEMENT**********************/
void traitement(SOCKET client){
    code .......
}
/*********************FIN DU TRAITEMENT*******************/


/************************************************************/
/****CONTROLE DES RETOURS DE MESSAGES DE WINDOWS*****/
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
         code .............
}
/***FIN DU CONTROLE DES RETOURS DE MESSAGES DE WINDOWS****/
/************************************************************/


jeudi 27 avril 2006 à 17:32:52 | Re : probleme socket + API ( +thread ?)

yoyo269

Membre Club
Houla !!!
Pas besoin de boucle d'écoute. Mais une boucle d'attente de connexion plutôt.
pour ça il faut que tu utilises un thread pour que ton prog ne se fige pas.

YOYO, @+.
[font=Comic Sans MS][size=3][b][green][:D] YOYO [;)][/green][/b][/size=3][/font=Comic Sans MS]
jeudi 27 avril 2006 à 19:25:36 | Re : probleme socket + API ( +thread ?)

AlexN

lut,

Communication par socket en mode connecté (SOCK_STREAM)

Organisation du serveur :

1) Création et attachement de la socket d'écoute socket()/bind()
2) Ouverture du service listen()
3) Attente de demande de connexion accept()
4) Traitement direct ou création d'un processus fork()
5) Parent -> Retour 3)
5) Enfant -> Traitement de la demande

Organisation du client :

1) Création (et attachement possible) d'une socket socket()/bind()
2) Construction de l'adresse serveur
3) Demande de connexion connect()
4) Si Echec(3) -> Retour 3)
4) Sinon : Dialogue avec le serveur

Il y a 2 unités de traitement au moins -> 2 process (2 programmes) ou 2 threads. Sinon, je ne vois pas d'autres solutions.
lundi 1 mai 2006 à 00:07:01 | Re : probleme socket + API ( +thread ?)

lolorenzeb

Réponse acceptée !
C'est bon j'ai trouver la solution. Il fallait bien que je crée un thread pour mettre ma boucle d'ecoute dedans. Pour ceux qui ont le meme probleme il faut utiliser la fonction CreateThread. Google vous aidera ;-)
lundi 1 mai 2006 à 10:36:57 | Re : probleme socket + API ( +thread ?)

yoyo269

Membre Club
C'est vrai que j'aurai dû te préciser la fonction, désolé !

YOYO, @+.

 YOYO
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !!!"



Cette discussion est classée dans : connexion, client, socket, sin, mb


Répondre à ce message

Sujets en rapport avec ce message

Probleme de Client Serveur [ par Krox68 ] voila jaimerais faire un programme client qui puisse se connecter a ce serveur : #include void main(){ WSADATA WSAData; WSAStartup(MAKEWORD(2,0), &WS problème socket sous windows [ par kod32 ] Voici mon code : (winsock2.h)-----------------------------int main(){ /* inialisation */ WSADATA wsa; WSAStartup(MAKEWORD(2,0), &wsa); /* Problème fermeture socket [ par alexixlebaulois ] Salut,Je suis en train de créer une appli qui communique avec plusieurs serveurs pour récupérer leur état. Toutes les communications se font en même t Client/Serveur, encore..... [ par glubust ] Je veux faire fonctionner une application client/serveur sous UNIX (client) et WINDOWS (serveur).Le programme client envoi une simple requête au serve Connexion à une BDD via socket en C [ par jumpup ] Bonjour à vous les développeurs!!!Alors tout d'abord je voudrai mettre les choses au clair: je suis une bille en programmation mais nos fameuses étude Client serveur [ par fanch314 ] Je que le serveur et le client échange par internet.Le serveur ne voit pas de client connectéEt le buffer du client contient nimporte quoi.En gros ils Problème d'IP Client avec les winsock [ par Cphil51 ] Boujour a tous.Je m'interesse en ce moment aux socket sous windows et j'ai un petit probleme actuellement. J'aimerais savoir comment récupérer l'IP d' Problème de connexion Socket [ par qhhu ] Bonjour !En temp normal, je programme en java, mais j'ai voulu essayer le c++parce que je trouve que c'est interessant de connaître plusieurs language Socket Protocole HTTP [ par victorcoasne ] Bonjour,J'ai fait un proxy qui intègre un serveur WEB et lorsque que je lui demande de s'interroger, je me rends compte qu'il y a une erreur.Cette err 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


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 : 5,647 sec (3)

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