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 :

Problème client réseau


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Par défaut Problème client réseau
    Bonjour ,
    je suis actuellement ce cours : https://bousk.developpez.com/cours/reseau-c++/
    et j'en suis à la première partie sur le TCP.
    Mon problème est que quand je lance le programme , il fonctionne mais à la fin cesse de fonctionner. J'ai essayé de supprimer des choses dans le main et de voir d'où vient le problème et apparemment c'est du constructeur du socket mais pourtant j'ai écris la même chose que dans le cours.

    main
    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
     
    #include <iostream>
    #include <winsock2.h>
    #include <string>
    #include "Sockets.h"
    #include "TCPSocket.h"
     
    int main()
    {
        if(!Sockets::Start())
        {
            std::cout << "Erreur inisialisation: " << Sockets::getError() << std::endl;
            return 1;
        }
     
        TCPSocket s;
     
     
        if(!s.Connect("127.0.0.1",42))
        {
            std::cout << "Erreur connexion serveur : " << Sockets::getError() << std::endl;
            return 1;
        }
     
        std::string answer;
     
        s.~TCPSocket();
        Sockets::Release();
        return 0;
     
    }
    Sockets.h
    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
     
    #ifndef SOCKETS_H_INCLUDED
    #define SOCKETS_H_INCLUDED
     
    #ifdef _WIN32
    #if _MSC_VER >= 1800
    #include <WS2tcpip.h>
    #else
    #define inet_pton(FAMILY,IP,PTR_STRUCT_SOCKADDR) (*(PTR_STRUCT_SOCKADDR)) = inet_addr((IP))
    typedef int socklen_t;
    #endif // _MSC_VER
    #include <WinSock2.h>
    #ifdef _MSC_VER
    #if _WIN32_WINNT >= _WIN32_WINNT_WINBLUE
    //Win 8.1 & +
    #pragma comment(lib,"Ws2_32.lib")
    #else
    #pragma comment(lib,"wsock32.lib")
    #endif // _WIN32_WINNT
    #endif // _MSC_VER
    #else
    #include <sys/socket.h>
    #include <netinet/in.h> //sockaddr_in , IPPROTO_TCP
    #include <arpa/inet.h> //hton* , ntoh* , inet_addr
    #include <unistd.h> //close
    #include <cerrno> //errno
    #define SOCKET int
    #define INVALID_SOCKET ((int)-1)
    #endif // _WIN32
     
    namespace Sockets
    {
        bool Start();
        void Release();
        int getError();
        void closeSocket(SOCKET socket);
    }
     
     
    #endif // SOCKETS_H_INCLUDED
    Sockets.cpp
    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
     
    #include "Sockets.h"
     
    namespace Sockets
    {
     
        bool Start()
        {
            #ifdef _WIN32
            WSADATA data;
            return WSAStartup(MAKEWORD(2,2),&data) == 0;
     
            #else
            return true;
            #endif // _WIN32
        }
        void Release()
        {
            #ifdef _WIN32
            WSACleanup();
            #endif // _WIN32
        }
        int getError()
        {
            #ifdef _WIN32
            return WSAGetLastError();
     
            #else
            return errno;
     
            #endif // _WIN32
     
        }
        void closeSocket(SOCKET socket)
        {
            #ifdef _WIN32
     
            closeSocket(socket);
     
            #else
     
            close(socket);
     
            #endif // _WIN32
        }
     
     
    }
    TCPSocket.h
    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
     
    #ifndef TCPSOCKET_H_INCLUDED
    #define TCPSOCKET_H_INCLUDED
     
    #include "Sockets.h"
    #include <string>
    #include <sstream>
     
    class TCPSocket
    {
     
        public:
        TCPSocket();
        ~TCPSocket();
        bool Connect(const std::string& ipAdress,unsigned short port);
     
        private:
        SOCKET Socket;
     
     
     
    };
     
     
    #endif // TCPSOCKET_H_INCLUDED
    TCPSocket.cpp
    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
     
    #include "TCPSocket.h"
     
    TCPSocket::TCPSocket()
    {
        Socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
        if(Socket == INVALID_SOCKET)
        {
            std::ostringstream error;
            error << "Erreur inisialisation : " << Sockets::getError();
            throw std::runtime_error(error.str());
        }
    }
    TCPSocket::~TCPSocket()
    {
        Sockets::closeSocket(Socket);
    }
    bool TCPSocket::Connect(const std::string& ipAdress,unsigned short port)
    {
        sockaddr_in server;
        server.sin_addr.s_addr = inet_addr("127.0.0.1");
        server.sin_family = AF_INET;
        server.sin_port = htons(port);
        return connect(Socket,(struct sockaddr*)&server,sizeof(server)) == 0;
    }
    Merci d'avance.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Le constructeur dans cette version peut générer une exception.
    Le debugger t'en dira certainement plus.

    Après, utiliser le port 42 ne me semble pas judicieux. Les ports à "petit nombre" sont réservés par le système et d'autres trucs.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Par défaut
    J'ai utilisé le debugger et j'ai eu ça :
    "Program received signal SIGSEGV, Segmentation fault."
    à la ligne 38 dans le Sockets.cpp (closeSocket)

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Donc ce n'est pas le constructeur.
    L'appel explicite au destructeur n'est pas correct ici. De manière général il est incorrect dans du code.
    Si tu veux limiter la durée de vie de la variable, utilise les mécanismes prévues pour ça : {}
    Dans closeSocket tu appelles... closeSocket. Tu as écrit une fonction récursive...
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Par défaut
    J'ai modifié le nom de la fonction et ça marche , merci.
    Par contre je comprend à quoi sert de créer un destructeur si on ne peux pas l'utilisé.

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    Le destructeur ne s'appelle jamais manuellement. Il est automatiquement appelé au travers de la destruction d'une instance, que ce soit pour une variable locale dont la portée est terminée, ou un pointeur sur lequel on appelle delete pour libérer la mémoire.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de réseau étrange
    Par Harry dans le forum Administration
    Réponses: 5
    Dernier message: 09/09/2006, 10h39
  2. [C#] Problème client-serveur TCP
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 7
    Dernier message: 02/06/2006, 16h23
  3. [Hardware][Technologie internet]Problème de réseau
    Par doudoustephane dans le forum Applications
    Réponses: 35
    Dernier message: 04/05/2006, 14h39
  4. Problème de réseau
    Par aliasjcdenton dans le forum Développement
    Réponses: 3
    Dernier message: 28/07/2004, 14h07
  5. Problème de réseau -> "symptômes" inconnus...
    Par patapetz dans le forum Développement
    Réponses: 13
    Dernier message: 03/12/2003, 18h12

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