Bonjour,
J'ai décidé il y a peu de créer deux classe pour faciliter l'utilisation des sockets.
L'une des classe permet de démarrer un socket en mode serveur, l'autre en mode client. Mais il semblerais que quand j'essaie de transmettre une donnée, le recv() ne fonctionne pas. J'ai essayé de trouver l'erreur par moi même, mais rien a faire, les données ne passent pas.
Voici les headers des classes :
Le client
--------
le serveur
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 class client { private : bool starter_check; string buffer; int erreur; SOCKET sock; SOCKADDR_IN sin; #if defined (WIN32) WSADATA WSAData; #endif public : // Creation de la socket client(int port, string ip_g); //destruction de la socket ~client(); // Envoie/reception des données bool getData(); bool sendData(); // getters/setters char *getBuffer(); bool setBuffer(char *newbuffer); };
---------
et voici les 2 main.cpp (les données sont envoyées entre deux programmes)
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 class server { private : bool starter_check; string buffer; int erreur; SOCKET sock; SOCKADDR_IN sin; SOCKET csock; SOCKADDR_IN csin; #if defined (WIN32) WSADATA WSAData; #endif public : // Creation de la socket server(int port); //destruction de la socket ~server(); // Envoie/reception des données bool getData(); bool sendData(); // getters/setters char* getBuffer(); bool setBuffer(char *newbuffer); };
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 // LE PREMIER MAIN char *buffer = "un test"; bool check; server *s = new server(23); check = s->setBuffer(buffer); check = s->sendData(); delete s; return 0; // LE DEUXIEME MAIN bool check; server *c = new client(23, "127.0.0.1"); check = c->getData(); char *buffer = c->gerBuffer(); cout << buffer << endl; delete c; return 0;
Je pense que l'erreur est peut-être due a la structure de mon code, mais il se peux que j'ai fais une faute lors de la création des sockets. C'est pour cela que je vais aussi mettre le cpp des classes :
server.cpp :
------------
Client.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117 #include "server.h" server::server(int port) { #if defined (WIN32) erreur = WSAStartup(MAKEWORD(2,2), &WSAData); #else erreur = 0; #endif if(!erreur) { sock = socket(AF_INET, SOCK_STREAM, 0); if(sock != INVALID_SOCKET) { // Ouverture de la socket = ok //configuration sin.sin_addr.s_addr = htonl(INADDR_ANY); sin.sin_family = AF_INET; sin.sin_port = htons(port); int ok = bind(sock, (SOCKADDR*)&sin, sizeof(sin)); if(ok != SOCKET_ERROR) { ok = listen(sock, 5); if(ok != SOCKET_ERROR) { int size = sizeof(csin); csock = accept(sock, (SOCKADDR*)&csin, &size); starter_check = true; } else starter_check = false; } else starter_check = false; } else starter_check = false; } else starter_check = false; } server::~server() { closesocket(csock); closesocket(sock); #if defined (WIN32) WSACleanup(); #endif } // ----------------------------------- // ----------------------------------- bool server::getData() { // Verifie si le constructeur n'a pas planté vector<char> buffer_p(5000); if(starter_check == false) { return false; } int ok = recv(sock, buffer_p.data(), sizeof(buffer_p), 0); if(ok != SOCKET_ERROR) { buffer_p.resize(ok); buffer = buffer_p.data(); return true; } else return false; } bool server::sendData() { //Veriefie si le constructeur n'a pas planté if(starter_check == false) { return false; } // Ceci est une fonction qui converti les string en char* char *buffer_p = stringToChar(buffer); int ok = send(sock, buffer.c_str(), sizeof(buffer), 0); if(ok != SOCKET_ERROR) { return true; } else return false; } // ------------------------------ // ------------------------------ char* server::getBuffer() { return stringToChar(buffer); } bool server::setBuffer(char *newbuffer) { if(starter_check == false) { return false; } buffer = newbuffer; return true; }
----------
Je sais que les deux dernier "codes" sont assez grands, mais je ne les ai que mis au cas ou.
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107 #include "client.h" client::client(int port, string ip_g) { #if defined (WIN32) erreur = WSAStartup(MAKEWORD(2,2), &WSAData); #else erreur = 0; #endif if(!erreur) { // Creation de la socket sock = socket(AF_INET, SOCK_STREAM, 0); // Connection configuration sin.sin_addr.s_addr = inet_addr(ip_g.c_str()); sin.sin_family = AF_INET; sin.sin_port = htons(port); // If connection if(connect(sock, (SOCKADDR*)&sin, sizeof(sin)) != SOCKET_ERROR) { starter_check = true; } else starter_check = false; } else starter_check = false; } client::~client() { closesocket(sock); #if defined (WIN32) WSACleanup(); #endif } // ******************** // ******************** bool client::getData() { // Verifie si le constructeur n'a pas planté vector<char> buffer_p(5000); if(starter_check == false) { return false; } int ok = recv(sock, buffer_p.data(), sizeof(buffer_p), 0); if(ok != SOCKET_ERROR) { buffer_p.resize(ok); buffer = buffer_p.data(); return true; } else return false; } bool client::sendData() { //Verifie si le client n'a pas planté if(starter_check == false) { return false; } char *buffer_p = stringToChar(buffer); int ok = send(sock, buffer.c_str(), sizeof(buffer), 0); if(ok != SOCKET_ERROR) { return true; } else return false; } // ------------------------------ // ------------------------------ char* client::getBuffer() { return stringToChar(buffer); } bool client::setBuffer(char *newbuffer) { if(starter_check == false) { return false; } buffer = newbuffer; return true; }
Merci de votre aide .
Partager