Bonjour à tous
Voila je suis depuis très longtemps confronté à un problème, qui est la communication entre un client et un serveur via les sockets en C++, tout deux sur le localhost.
Je m'explique :
Mon serveur à priori fonctionne, car j'arrive à m'y connecter avec un client telnet, ou même avec un client que j'avais réalisé en Java. Donc de ce côté la, ça à l'air d'aller.
Toutefois, le client que j'ai fait en C++ ne veut pas se connecter, et pourtant je ne récupère strictement aucun messages d'erreur.
Voici le code source du client (simplissime à souhait) :
Sachant que le port que j'utilise (exemple ici 45624) est libre et que j'utilise le même des deux côtés, de même pour la configuration du serveur. Voici le code mon 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
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 #include <winsock2.h> /*socket*/ #include <stdio.h> /*printf*/ #include <iostream> #pragma comment(lib, "ws2_32.lib") using namespace std; int main() { int n; WSADATA WSAData; if (WSAStartup(MAKEWORD(2,0), &WSAData)!= 0 ) { cout << " Erreur à l'initialisation du dll !" << endl; exit(2); } else { SOCKET s_client; s_client = socket(PF_INET, SOCK_STREAM, 0); if (s_client == INVALID_SOCKET) { cout << " Erreur à l'initialisation du socket !" << endl; exit(2); } SOCKADDR_IN server; char buffer[4096]; char msg[256]; server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr("127.0.0.1"); server.sin_port = htons(45624); memset(&server.sin_zero, '\0', sizeof(server.sin_zero)); cout << "avant bind" << endl; bind(s_client, (SOCKADDR *)&server, sizeof(server)); cout << "apres bind" << endl; connect(s_client, (SOCKADDR *)&server, sizeof(server)); cout << "apres connect " << endl; while(1) { cout << " dans le while" << endl; cin >> buffer; send(s_client, buffer, sizeof(buffer), 0); } WSACleanup(); } return 0; }
Mon serveur est sensé afficher "Le client "IP_CLIENT" s'est connecté", ce qu'il fait avec tout mes autres clients, mais pas avec mon client C++.
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 #include <winsock2.h> //socket #include <stdio.h> //printf #include <iostream> #include <string.h> #pragma comment(lib, "ws2_32.lib") using namespace std; int main() { char buffer[4096]; WSADATA WSAData; if (WSAStartup(MAKEWORD(2,0), &WSAData) != 0) { cout << " Erreur à l'initialisation du dll !" << endl; exit(2); } else { SOCKET s_server, s_client; SOCKADDR_IN server; SOCKADDR_IN client = { 0 }; server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons(45624); memset(&server.sin_zero, '\0', sizeof(server.sin_zero)); s_server = socket(AF_INET,SOCK_STREAM,0); s_client = socket(AF_INET,SOCK_STREAM,0); cout << "Demarrage serveur" << endl; if (bind(s_server, (SOCKADDR *)&server, sizeof(server)) == SOCKET_ERROR) fprintf(stderr, "La fonction bind a echoue.\n"); else { while(1) { cout<< "on entre dans la boucle" << endl; if (listen(s_server, 5) == SOCKET_ERROR) /* listen : commencer l'ecoute */ fprintf(stderr, "La fonction listen a echoue.\n"); else { int csize = sizeof(client); s_client = accept(s_server, (SOCKADDR *)&client, &csize); if (s_client == INVALID_SOCKET) { fprintf(stderr, "La fonction accept a echoue.\n"); } else { char buffer[4096]; int n = 0; printf("Le client %s s'est connecte !\n", inet_ntoa(client.sin_addr)); while(strcmp(buffer,"exit")!=0) { recv(s_client, buffer, sizeof(buffer) - 1, 0); //cout << buffer << endl; if (n != SOCKET_ERROR) { cout << buffer << endl; } strcpy(buffer,""); } closesocket(s_client); } } } WSACleanup(); } } return 0; }
Je crois avoir localisé le problème au niveau de "accept()", car il bloque ici j'ai l'impression.
Merci pour vos proposition je rame depuis trop longtemps
PS : Ca fait un moment que je cherche sur les forums aussi, mais je ne trouve pas ce problème
Cdt,
Vespiras
Partager