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