Bonjour,
J'ai débuté avec les Sockets la semaine dernière et plusieurs questions me viennent à l'esprit pour le moment. C'est donc tout naturellement que je vous les pose :
- L'utilisation des Sockets avec TCP requiert t-il, à chaque échange entre le client et le serveur, un nouvel appel de connexion ?
- Si, pour des besoins spécifiques, le client doit également envoyer des messages au serveur - notamment lorsque celui-ci se déconnecte -, est-il possible de développer cette fonctionnalité en incluant une condition sur la réception dans ma boucle d'écoute côté serveur ?
Pour l'instant j'ai développé une application assez basique :
- Une application "Client"
- Une application "Serveur"
- Sur mon application Client j'ai un contrôle EDIT dans lequel l'utilisateur saisit l'adresse IP sur serveur auquel il souhaite se connecter.
- Si la connexion passe, le serveur lui envoie un message.
Jusqu'ici tout va bien. Maintenant, j'aimerais simplement faire en sorte que, lorsque l'utilisateur clique sur un contrôle BUTTON de déconnexion, l'application cliente envoie un message de déconnexion.
Pour le moment, j'essaye d'afficher ce message sur la partie serveur, sans succès.
Je m'y prends sans doute mal, alors si toutefois vous aviez un peu de temps, un peu d'aide serait la bienvenue.
Voici mon code client (associé au bouton de contrôle de connexion) :
Les vérifications ne sont pas encore effectuées, je pars pour l'instant du principe que tout se passe correctement.
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 void CClientView::OnBnClickedButtonConnexion() { UpdateData(TRUE); std::string s = CT2A(m_strServeur.GetBuffer(m_strServeur.GetLength()+1)); ip = s.c_str(); //m_strServeur.ReleaseBuffer(); SOCKADDR_IN sin; sock = socket(AF_INET, SOCK_STREAM, 0); sin.sin_addr.s_addr = inet_addr(ip); sin.sin_family = AF_INET; sin.sin_port = htons(1500); connect(sock, (SOCKADDR *)&sin, sizeof(sin)); char buffer[255]; recv(sock, buffer, sizeof(buffer), 0); if(recvMessage = "ok") { m_ButtonConnexion.EnableWindow(FALSE); m_ButtonDeconnexion.EnableWindow(TRUE); m_strNote = "La connexion est établie..."; UpdateData(FALSE); } //closesocket(sock); //WSACleanup(); }
Voici mon code client (associé au bouton de contrôle déconnexion)
Enfin, voici mon code côté serveur (associé à un contrôle réception)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void CClientView::OnBnClickedButtonDeconnexion() { send(sock, "pok", sizeof("pok"),0); }
(recv() me renvoie une erreur).
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 void CServeurView::OnBnClickedButtonEcoute() { WSADATA WSAData; WSAStartup(MAKEWORD(2,0), &WSAData); char buffer[255]; SOCKET socketEcoute; SOCKET socketRelais; SOCKADDR_IN sinEcoute; SOCKADDR_IN sinRelais; socketEcoute = socket(AF_INET, SOCK_STREAM, 0); sinEcoute.sin_addr.s_addr = INADDR_ANY; sinEcoute.sin_family = AF_INET; sinEcoute.sin_port = htons(1500); bind(socketEcoute, (SOCKADDR *)&sinEcoute, sizeof(sinEcoute)); listen(socketEcoute, 0); while(1) { int sinsize = sizeof(sinRelais); if((socketRelais = accept(socketEcoute, (SOCKADDR *)&sinRelais, &sinsize)) != INVALID_SOCKET) { send(socketRelais, "ok", sizeof("ok"),0); } if(recv(socketEcoute, buffer, sizeof(buffer), 0) != SOCKET_ERROR) { FILE * pFile; pFile = fopen("toto.txt", "a"); fprintf(pFile,"RECV = %s\n",buffer); fclose(pFile); } } }
A terme je pense que les deux applications seront à la fois serveur, donc j'ai besoin de comprendre la subtilité du schème.
Partager