Bonjour a tous voici mon problème :
Je suis actuellement en train de programmer dans le cadre de mon enseignement sur les sockets, un serveur qui test la connectivitée de ces clients.
J'utilise la technique du ping, le serveur envoit un ping au client et test si celui ci lui renvoit un pong. Si c'ets le cas il retest dans 1sec, sinon il le considère comme deconnecté.
Mon problème est que le serveur n'attend aucune réponce : j'aimerai en gros que le serveur fonctionne en se disant " si il n'y a pas de réponce dans les 1/4secondes alors il est deconnecté".
simplement je ne voix pas du tout comment procéder
Voici mon code :
Client :
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 // Client #include <iostream> #include <winsock2.h> using namespace std; int main() { cout << "Client\n\n" << endl; WSADATA WSAData; WSAStartup(MAKEWORD(2,0), &WSAData); SOCKET sock; SOCKADDR_IN sin; sock = socket(AF_INET, SOCK_STREAM, 0); sin.sin_addr.s_addr = inet_addr("127.0.0.1"); sin.sin_family = AF_INET; sin.sin_port = htons(8889); connect(sock,(SOCKADDR *)&sin,sizeof(sin)); char buffer[1024] = "\0"; int i = recv(sock,buffer,sizeof(buffer),0); if (i != false) { if (buffer[0] == '\0') cout << "Aucun Serveur Disponible"; else // connection au serveur { cout << "Connecte au Serveur\n\n"; while(true) { char ping[1024] = "\0"; int y = recv(sock,ping,sizeof(ping),0); if(y != false) { if(ping[0] != '\0') // si le serveur a envoyer un ping { send(sock, "Pong\0",6, 0); // reponce du client } } } } } getchar(); return EXIT_SUCCESS; }
Serveur :
Merci à tous ceux qui se pencheront sur mon problème
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 // Serveur #include <iostream> #include <winsock2.h> using namespace std; int main() { cout << "Serveur\n\n\n" << endl; WSADATA WSAData; WSAStartup(MAKEWORD(2,0), &WSAData); SOCKET sock; SOCKET csock; SOCKADDR_IN sin; SOCKADDR_IN csin; sock = socket(AF_INET, SOCK_STREAM, 0); sin.sin_addr.s_addr = inet_addr("127.0.0.1"); sin.sin_family = AF_INET; sin.sin_port = htons(8889); bind(sock, (SOCKADDR *)&sin, sizeof(sin)); listen(sock, 0); while(true) { int sinsize = sizeof(csin); if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET) { cout << "Connection d'un client\n\n\n" << endl; bool connect = true; while(connect)// tant que le client est connecter { cout << "Test Presence du Client : Ping " <<endl; send(csock, "Ping\0",6, 0); char buffer[1024] = "\0"; int i = recv(sock,buffer,sizeof(buffer),0); if (i != false) { cout << "Reponce client : " << buffer << endl; if (buffer[0] == '\0') // le client ne répond pas { cout << "Client Deconnecte\n\n\n"; connect = false; } else { cout << "Client Connecte "; } } Sleep(1000); } } } closesocket(sock); closesocket(csock); WSACleanup(); return EXIT_SUCCESS; }
Partager