Bien le bonjour a tous ^^ - Je viens souvent sur le site pour apprendre les ficelles du métier comme on dis. Je trouve ce site vraiment génial et j'aimerai commencer a entrer dans la communauté ^^
Je me lance ! Alors, j'ai voulu coder un programme de client sous builder 6 qui se connecte a un serveur codé en C. Le serveur doit recevoir en permanence des données jusqu'à déconnexion du client. J'ai donc mit un " while(1)" pour boucler la réception. Le soucis, c'est que j'aimerai avoir une "déconnexion propre". Par exemple, mon client se déconnecte pour laisser la place a un autre et ainsi libérer le serveur. Or, si je fait...
... pour déconnecter mon client, le serveur reste inactif... et si je ferme mon programme, j'ai l'erreur 10053. Voici le code serveur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 TcpClient1->Disconnect(); TcpClient1->Close();
Donc mon soucis est de garder le serveur ouvert jusqu'à la déconnexion du client de borland. Je sais que l'erreur est le while(1) mais sans cela, le serveur reçois une fois les données et se ferme, ne permettant aucune connexion.... J'ai testé avec un serveur sous borland en indiquant avec un label l'état du serveur. Et je n'ai jamais vu "déconnexion" affiché. Même avec les ->Disconnect() et ->Close() .
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 if(sock_err != -1) // ou SOCKET_ERROR { //Demarrage de l'ecoute à partir du server sock_err = listen(sock, 5); printf("Ecoute du port %d...\n", PORT); /* Si la socket fonctionne */ while(1) { if(sock_err != -1) // ou SOCKET_ERROR { /* Attente pendant laquelle le client se connecte */ printf("Patientez pendant que le client se connecte sur le port %d...\n", PORT); sock = accept(sock, (SOCKADDR*)&sin, &recsize); printf("Un client se connecte avec la socket %d de %s \n", sock, inet_ntoa(sin.sin_addr), htons(sin.sin_port)); sock_err = send(sock, buffer, 50, 0); if(sock_err != -1) { if(recv(sock, buffer ,sizeof(buffer), 0) != SOCKET_ERROR) strcpy(buffer1, buffer); if(recv(sock, buffer ,sizeof(buffer), 0) != SOCKET_ERROR) strcpy(buffer2, buffer); if(recv(sock, buffer ,sizeof(buffer), 0) != SOCKET_ERROR) strcpy(buffer3, buffer); } printf("1ére val : %s\n",buffer1); printf("2nd val : %s\n",buffer2); printf("3éme val : %s\n",buffer3); } } //fermeture de la socket printf("Fermeture de la socket...\n"); closesocket(sock); printf("Fermee \n"); } //libére les ressources allouées par la fonction WSAStartup() WSACleanup(); }
J'espère avoir été clair. Si vous voulez des précisions, hésitez pas.
Partager