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
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 #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); };
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
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; }
Merci de votre aide !
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 }
Cordialement
Partager