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

  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 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 : 45
    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)

  5. #5
    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

  6. #6
    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

  7. #7
    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 : 45
    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.

  8. #8
    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é.

  9. #9
    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.

  10. #10
    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
    Je ne sais pas si les overlapped IO marchent sur la console.
    Ben ça marche pas pour n'importe quel HANDLE ?

  11. #11
    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
    Ben non... Sous 98, ça ne marchait que pour les ports COM.
    Sous XP, je ne sais pas pour quoi ça marche, mais sûrement pas pour "nimporte quel handle" (pas sur un mutex, en tout cas). La doc mentionne ports série et parallèles, fichiers, mailslots, pipes, mais ils ne disent rien sur une console ("Console input buffer"). Enfin, il est toujours possible de tester...
    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.

  12. #12
    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
    Ben non... Sous 98, ça ne marchait que pour les ports COM.
    L'overlapped I/O n'existe que sur NT/2000/XP...

    mais ils ne disent rien sur une console
    Ce sont des pipes.

  13. #13
    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
    Citation Envoyé par loufoque
    L'overlapped I/O n'existe que sur NT/2000/XP...
    Citation Envoyé par MSDN
    Windows Me/98/95: For operations on files, disks, pipes, or mailslots, this parameter must be NULL. A pointer to an OVERLAPPED structure causes the call to fail. However, you can perform overlapped I/O on serial and parallel ports.
    Citation Envoyé par loufoque
    Ce sont des pipes.
    Non, les consoles sont spéciales. ReadConsole() et WriteConsole() marchent sur des consoles et pas sur des pipes...
    Par conséquent, j'ignore si ReadFile() va réussir ou échouer si je lui passe une OVERLAPPED sous XP... (Et là, je n'ai pas le temps de tester).
    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.

  14. #14
    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
    j ai cree un header pour mon code et modifie les commandes du serveur et client mais quand j' execute le program j ai ces error qui apparaissent

    chat_server.obj : error LNK2001: unresolved external symbol __imp__listen@8
    chat_server.obj : error LNK2001: unresolved external symbol __imp__bind@12
    .
    .
    .
    pourtant quand je build le programme il n ya pas d erreur
    pourquoi cela

  15. #15
    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 : 45
    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
    il manque le lien avec "winsock2.lib"

  16. #16
    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
    c bon j ai ajoute ws2_32.lib ce qui m areduit le nombre d erreur maintenant le problem c est

    nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
    nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
    mais qui fait partir du lib de MFC comment dois je faire pour le rattacher a mon programme?

  17. #17
    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 : 45
    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
    Sortit d'un de mes projets

    ws2_32.lib
    Vfw32.lib
    Winmm.lib

    Logiquement il y a tout la... (enfin j'espère )

  18. #18
    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
    toujours pas il il y a le meme probleme

    --------------------Configuration: chat_server - Win32 Debug--------------------
    Linking...
    nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
    nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
    Debug/chat_server.exe : fatal error LNK1120: 2 unresolved externals
    Error executing link.exe.

    chat_server.exe - 3 error(s), 0 warning(s)
    je pense que c est parce que j ai ajoute la library "afxwin.H" dans mon header
    mais quand j incoorpore pragma comment (lib,"nafxcwd.lib") ca ne fonctionne pas

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