Bonjour,
Je suis en train de programmer une petite bibliothèque pour simplifier l'utilisation de Windows Socket API avec la suite TCP/IP dans le cadre de mon projet d'études. Toutefois je suis un grand novice en la matière et, bien évidemment, je fais face à quelques problèmes et interrogations concernant cette interface de programmation. J'ai donc décidé de créer ce sujet pour poser toutes mes questions sur le "combo" Winsock2-TCP/IP. Oui, j'ai bien dit "toutes mes questions"!
Avant de commencer la danse, je tiens à préciser quelques points qui pourront servir par la suite. Tout d'abord, je programme avec Visual C++ 2010 sur Windows 7 et j'utilise la version 2.2 de WSA. Ensuite, j'ai tendance à appeler les sockets qui "se contentent" de guetter les connexions entrantes des "listeners" (à cause de la fonction listen) afin de les distinguer des autres sockets qui servent dans la communication.
Je propose maintenant d'entrer dans le vif du sujet avec la première question:
[1] - J'ai dans mon programme un socket connecté à un hôte distant; il s'appelle mySocket. Pour vérifier s'il a reçu des données j'utilise le code ci-dessous.
Mon problème se trouve dans le cas où iErr vaut 1. En effet, lorsque l'hôte distant rompt la connexion, mon socket reçoit des données de taille nulle. Ainsi, la fonction FD_ISSET ne m'est d'aucun secours. Y a-t-il un moyen de savoir si la connexion est toujours établie, sans faire appel à la fonction recv? Peut-être via la fonction select, en testant l'éligibilité en écriture du socket ou en vérifiant s'il n'a pas reçu quelque(s) exception(s)?
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 struct fd_set rSet; struct timeval timeout; int iErr; FD_ZERO(&rSet); FD_SET(mySocket, &rSet); timeout.tv_sec = 0; timeout.tv_usec = 10; iErr = select((int)mySocket + 1, &rSet, NULL, NULL, &timeout); if(iErr == SOCKET_ERROR) { //ERREUR! } else if(iErr == 0) { //Socket toujours connecté; aucune donnée reçue } else //if(iErr == 1) { //Soit la connexion a été rompue //Soit le socket a reçu des données }
Merci d'avance pour votre aide.
Adishatz!
PS: Désolé, si j'ai créé ce nouveau sujet dans la mauvaise section.
Partager