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 d'exception non gérée avec les sockets C++


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 48
    Points : 24
    Points
    24
    Par défaut Problème d'exception non gérée avec les sockets C++
    Bonjour,
    Je suis en train de développer une application graphique sous Visual Studio 2010 en C++ / CLI (Windows Forms). Cette application doit communiquer avec plusieurs clients via le réseau. Pour cela, elle utilise les sockets.

    J'ai une méthode publique issue de la classe Surveillance appelé par un pointeur dans le header de l'interface graphique (Form1.h), je n'ai pas trouvé comment accéder aux méthodes de la classe via Form1.h autrement que par pointeur.

    Cette méthode initialise la connexion réseau et plante lorsque la fonction socket() est appelé. Apparemment, j'ai une exception qui n'est pas gérée
    La génération se fait bien mais lorsque je lance le programme en mode sans débogage, j'ai ce message :



    En mode débogage normal, je n'ai aucune erreur cela dit.

    Les codes :

    Fichier surveillance.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
     
    #pragma once
    #include <WinSock2.h>
    #pragma comment(lib, "ws2_32.lib")
    #include <iostream>
    #include <string>
     
    #define dim 14
     
    ref class Surveillance
    {
    	int portServeur;
    	SOCKET sock, sockClient, sockServeur;
    private:
    	int initialisationWSA();
    public:
    	Surveillance(void);
    	int initialiserReseau();
    	int demarrerSurveillance();
    	int arreterSurveillance();
    	void setParametres(int);
    };
    Fichier surveillance.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
    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
     
    #include "StdAfx.h"
    #include "Surveillance.h"
     
    using namespace std;
     
    Surveillance::Surveillance(void)
    {
    	portServeur = 21500;
    }
    // Définition des méthodes privées
    int Surveillance::initialisationWSA()
    {
    	WSADATA WSAData;
    	int ok = -1;
    	int erreur = WSAStartup(MAKEWORD(2,0), &WSAData);
    	if(erreur != INVALID_SOCKET)
    	{
    		ok = 0;
    	}
    	return ok;
    }
    // Définition des méthodes publiques
    int Surveillance::initialiserReseau()
    {
    	// initialise la connexion réseau
    	int ok = -9;
    	int wsa = initialisationWSA();
    	if(wsa == 0)
    	{
    		ok = -8;
    		sockServeur = socket(AF_INET, SOCK_STREAM, 0);// ça plante à ce niveau là !
            if(wsa == 0)
    	{
     
    		SOCKADDR_IN serveur;
    		serveur.sin_family = AF_INET;
    		serveur.sin_addr.s_addr = htonl(INADDR_ANY); // accepte toutes les adresses
    		serveur.sin_port = htons(portServeur); // écoute le port défini par portServeur
    		if((bind(sockServeur, (SOCKADDR *)&serveur, sizeof(serveur))) == SOCKET_ERROR)
    		{
    			ok = -2;
    		}
    		else
    		{
    			if((listen(sockServeur, 0)) == SOCKET_ERROR)
    			{
    				ok = -3; 
    			}
    			else
    			{
    				SOCKADDR_IN client;
    				int clientsize = sizeof(client);
    				sock = accept(sockServeur, (SOCKADDR *) &client, &clientsize);
    				if((sock == INVALID_SOCKET))
    				{
    					ok = -4;
    				}
    				else
    				{
    					//adresse = inet_ntoa(serveur.sin_addr);
    					ok = 0;
    				}
    			}
    		}
    	}
    	return ok;
    }
    int Surveillance::demarrerSurveillance()
    {
    	return 0;
    }
    int Surveillance::arreterSurveillance()
    {
    	return 0;
    }
    void Surveillance::setParametres(int serv)
    {
    	this->portServeur = serv;
    }
    Et le bout du code de Form1.h qui appele ma méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
    			 this->etatInit->Text = L"Initialisation de l'application ... ";
    			 int net = surv->initialiserReseau(); // ça plante à ce niveau là !!
    			 this->etatInit->Text = L"Valeur : " + Convert::ToString(net); // renvoi la valeur de retour de initialiserReseau pour essai
    		 }
    Merci de votre aide !
    Cordialement

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut
    Je ne vois pas ce qui cause une telle erreur dans ta fonction.

    Par contre, pourquoi utiliser socket() plutôt que les classes de .Net?

    PS: WSAStartup() ne retourne jamais INVALID_SOCKET: WSAStartup retourne zéro (ERROR_SUCCESS) ou un code d'erreur WSAE*.
    PPS: Où est initialisé surv?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 48
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Je ne vois pas ce qui cause une telle erreur dans ta fonction.

    Par contre, pourquoi utiliser socket() plutôt que les classes de .Net?

    PS: WSAStartup() ne retourne jamais INVALID_SOCKET: WSAStartup retourne zéro (ERROR_SUCCESS) ou un code d'erreur WSAE*.
    PPS: Où est initialisé surv?

    Je n'ai pas songé à les utiliser en réalité donc je n'ai fait aucune recherche.

    surv est initialisé au début du Form1.h, en tant que pointeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public ref class Form1 : public System::Windows::Forms::Form
    	{
    		Surveillance ^surv;
    	public:
     
    		Form1(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: ajoutez ici le code du constructeur
    			//
    		}

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut
    Je vois une déclaration dans ce morceau de code, mais aucune initialisation...

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Le texte de l'exception dit qu'il s'agit d'une NullReferenceException, ce qui signifie que tu manipule une référence nulle ; hors la fonction initialiserReseau() ne manipule aucune référence. C'est donc que la référence en question est l'objet utilisé pour appeler la fonction initialiserReseau().

    Je rejoins donc Médinoc : tu déclares surv, mais tu ne l'initialiser jamais.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 48
    Points : 24
    Points
    24
    Par défaut
    L'initialiser ok mais comment initialiser un pointeur sur une classe ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut
    En instanciant la classe?
    Code C++/CLI : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		Form1(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: ajoutez ici le code du constructeur
    			//
    			surv = gcnew Surveillance;
    		}

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 48
    Points : 24
    Points
    24
    Par défaut
    Tout simplement

Discussions similaires

  1. problèmes avec les sockets
    Par lukbutor dans le forum Réseau
    Réponses: 24
    Dernier message: 23/04/2007, 01h12
  2. Problème avec les sockets
    Par projeticq dans le forum Réseau
    Réponses: 14
    Dernier message: 19/04/2007, 09h32
  3. Problème avec les sockets et la fonction accept
    Par projeticq dans le forum Réseau
    Réponses: 6
    Dernier message: 13/04/2007, 11h37
  4. Problème d'envoie de text avec les sockets
    Par Coussati dans le forum Web & réseau
    Réponses: 6
    Dernier message: 16/09/2005, 10h26
  5. [Win32] Problème avec les sockets
    Par mickael777 dans le forum MFC
    Réponses: 3
    Dernier message: 12/08/2005, 11h15

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