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 averti
    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
    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
    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 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?
    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 averti
    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
    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
    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 vois une déclaration dans ce morceau de code, mais aucune initialisation...
    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.

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  6. #6
    Membre averti
    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
    Par défaut
    L'initialiser ok mais comment initialiser un pointeur sur une classe ?

  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
    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;
    		}
    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 averti
    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
    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