IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

communication avec socket


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2005
    Messages : 23
    Par défaut communication avec socket
    j ai modifie un programme server/client pour pouvoir communiquer avec les sockets dans le but d elaborer un petit chat.
    malheuresement pour que ca fonctionne le server doit absolument etre le premier a envoyer le message et la communication est la suivante server-client puis client-server
    C est pour cela que je ne considere pas ca vraiment comme un chat j aimerais pouvoir des que je lance les programmes etre capable de communiquer comme dans un vrai chat donc que le client ou le server soit capable d envoyer autant de messages qu'il veut.

    pouvez- vous jetter un coup d oeil a ce code merci d avance


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    CLIENT
    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    #include<string.h>
    #include<winsock2.h>
    #pragma comment (lib, "ws2_32.lib")
     
    void Couleur(int);
    void main()
    {
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,0), &WSAData);
        SOCKET sock, csock;
        SOCKADDR_IN sin;
        int tentative; //Nombre de tentative pour se connecter au server
        char buffer[50]; //Message à envoyer
        bool connection; //Terminer la connection
     
        printf("\n\n\t\t\t\t CLIENT\n");
        printf("\t\t\t\t ------\n\n");
        sock = socket(AF_INET, SOCK_STREAM, 0);
        sin.sin_addr.s_addr = inet_addr("127.0.0.1");
        sin.sin_family = AF_INET;
        sin.sin_port = htons(69);
        tentative = 0;
        do
        {
            connection = false;
            csock = connect(sock, (SOCKADDR *)&sin, sizeof(sin)); //Connection au server
            if(csock != SOCKET_ERROR)
            {
                printf("\n\n Connexion etablie...");
     
                do
                {
                    recv(sock, buffer, sizeof(buffer), 0); //Reçoit le message duserver
     
                    if(strcmp(buffer, "EXIT") != 0) //Le server envoit EXIT pour stopper le tchat
                    {
                        Couleur(12);
                        printf("\n\n Server : ");
                        Couleur(7);
                        printf("%s", buffer); //Affiche le message envoyer par le server
                        printf("\n * Message : ");
                        fflush(stdin);
                        gets(buffer);
                        send(sock, buffer, sizeof(buffer), 0); //Envoit un message au server
                    }
                }while(strcmp(buffer, "EXIT") != 0);
                connection = true;
            }
            else
            {
                printf("\n\n\a\t\t ERREUR DE CONNECTION AVEC LE SERVER\n\n");
                tentative++;
                printf(" Appuyer sur une touche pour essayer de vous connecter...");
                getch();
            }
        }while(tentative < 3 && connection == false);
        closesocket(sock); //Ferme le socket
        WSACleanup(); //Ferme les WSA
        printf("\n\n Appuyer sur une touche pour quitter...");
        getch();
    }
    void Couleur(int color) 
    { 
        HANDLE hcon = GetStdHandle(STD_OUTPUT_HANDLE); 
    SetConsoleTextAttribute(hcon, color); }
    
    
    
    SERVER
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<winsock2.h>
    #pragma comment (lib, "ws2_32.lib")
    void Couleur(int);
     
    void main()
    {
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,0), &WSAData);
        SOCKET sock, csock;
        SOCKADDR_IN sin, csin;
        int csinsize;
        char buffer[50];
        bool envois = false;
     
        printf("\n\n\t\t\t\t SERVER\n");
        printf("\t\t\t\t ------\n\n");
     
        sock = socket(AF_INET, SOCK_STREAM, 0);
        sin.sin_addr.s_addr = INADDR_ANY;
        sin.sin_family = AF_INET;
        sin.sin_port = htons(69);
     
        bind(sock, (SOCKADDR *)&sin, sizeof(sin));
        listen(sock, 2);
     
        printf(" Attente de connection avec le client...");
        csinsize = sizeof(csin);
        csock = accept(sock, (SOCKADDR *)&csin, &csinsize);
        printf("\n Connexion etablie...\n\n");
     
        if(csock != INVALID_SOCKET) //Si la connection est acceptée
        {
            do
            {
                printf("\n * Message : ");
                fflush(stdin);
                gets(buffer);
                send(csock, buffer, sizeof(buffer), 0); //On envoit un message au client
                recv(csock, buffer, sizeof(buffer), 0); //On attend une rèponse de la part du client
     
                Couleur(14);
                printf("\n\n Client : ");
                Couleur(7);
                printf("%s", buffer); //Affiche le message envoyé par le client
     
            }while(strcmp(buffer, "EXIT") != 0); //Le client envoit EXIT pour stopper le tchat
        }
        closesocket(sock); //Ferme le socket
        WSACleanup(); //Ferme le WSA
        printf("\n Connexion terminee...\n\n");
        printf("\n Appuyer sur une touche pour quitter...");
        getch();
    }
     
    void Couleur(int color) 
    { 
        HANDLE hcon = GetStdHandle(STD_OUTPUT_HANDLE); 
    SetConsoleTextAttribute(hcon, color); }
    ]
    [/QUOTE][/CODE]

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Sous Winsock, j'ai souvent une solution simple en mode fenêtre: As-tu déjà programmé en mode fenêtre?

    Si oui, ça va être facile.
    Si non, ça va être plus dur (Il faudra réussir à lire la console avec un timeout, ce qui n'est pas évident puisque select() ne marche pas sur les flux standard. La seule façon que j'ai trouvée et qui marche était affreuse).
    Ou bien, il restera toujours la solution d'un programme bi-threadé (un thread qui ne fait que lire sur la console, l'autre qui fait les opérations sur le socket)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé Avatar de gijy
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Par défaut
    Jette un oeil dans la msdn library sur windows socket dans MFC, il y a un exemple de chat client serveur (chatsvr et chatter) directement compilable sous .net qui fonction tres bien chat entres 2 clients via le serveur.
    Explication zero mais le code est court et facile à lire.
    lien: http://msdn.microsoft.com/library/fr...ets_in_mfc.asp
    courage!!

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2005
    Messages : 23
    Par défaut
    Citation Envoyé par gijy
    l y a un exemple de chat client serveur (chatsvr et chatter) directement compilable sous .net qui fonction tres bien chat entres 2 clients via le serveur.
    lien: http://msdn.microsoft.com/library/fr...ets_in_mfc.asp
    merci d avoir repondu
    je travaille sur VC6 quand j essay de faire fonctionne les programmes chatter/chatsvr ca ne fonctionnes pas pourtant je suis les informations donnees

    lorsque je cherche sur le net les informations sur comments creer des sockets en utilisant MFC je ne trouve pas de bon tutorials mais seulement comment creer des fenetres et ajouter des bouttons
    si quelqu'un a un lien peut-il me le faire savoir
    merci

  5. #5
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Dans la FAQ Article

    Il y a plein d'articles sur le site.

    Sinon dans le forum le sujet est assez récurent.

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Si non, ça va être plus dur (Il faudra réussir à lire la console avec un timeout, ce qui n'est pas évident puisque select() ne marche pas sur les flux standard. La seule façon que j'ai trouvée et qui marche était affreuse).
    Bah il suffit d'utiliser les fonctionnalités d'overlapped I/O de Windows non ?

    raggnar :
    On t'a pas appris que gets() c'était le mal ?
    Accessoiremment comme c'est le forum C++ ce serait pas mal de coder en C++. Sinon y'a le forum C à côté.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je ne sais pas si les overlapped IO marchent sur la console. Mais j'ai trouvé l'origine du problème des timeout qui ne marchaient pas:
    On peut sans problème utiliser WaitForSingleObject() sur la console et lire s'il y a des données, à condition d'utiliser la console en mode "caractère par caractère".
    Si on laisse la console en mode ligne par ligne, WaitForSingleObject() se débloque trop tôt et le programme se retrouve bloqué dans la fonction de saisie (fgets(), ReadConsole(), ...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Citation Envoyé par Médinoc
    Ou bien, il restera toujours la solution d'un programme bi-threadé (un thread qui ne fait que lire sur la console, l'autre qui fait les opérations sur le socket)
    Personnellement je suis plus sur cette solution qui est plus ouverte, fonctionne en mode console/fenêtre, et est quasi directement portable sur un autre système (en ne modifiant pas trop son code)

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2005
    Messages : 23
    Par défaut
    Citation Envoyé par Médinoc
    Sous Winsock, j'ai souvent une solution simple en mode fenêtre: As-tu déjà programmé en mode fenêtre?
    tous d abord merci d avoir repondu
    non je ne pense pas avoir encore programme en mode fenetre mais peux-tu me donne un lien pour le verifier et aussi pour un programme bi-threade stp

    Ou bien, il restera toujours la solution d'un programme bi-threadé (un thread qui ne fait que lire sur la console, l'autre qui fait les opérations sur le socket)
    une question que je me pose est ce que c est meme possible de realiser un chat en utilisant un TCP socket et un UDP socket parce que c est l objectif que j aimerais atteindre
    merci

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/05/2010, 11h32
  2. communication avec les sockets
    Par yacin87 dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 09/04/2010, 07h50
  3. Problème communication serveur/client avec Socket
    Par Nicolas74 dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 03/12/2009, 16h54
  4. pb avec socket
    Par claude294 dans le forum MFC
    Réponses: 2
    Dernier message: 16/01/2004, 20h40
  5. [SSL]Communication avec un serveur en https
    Par menon dans le forum Développement Web en Java
    Réponses: 3
    Dernier message: 04/09/2003, 16h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo