bonsoir,
j'ai créé un reseau grace aux CSocketFile et CArchive.
je voudrais gérer la déconnexion brutale du client
sur mon serveur j'ai ce bout de code:
j'utilise la fonction d'envoie dans un timer et voila comme je fais:
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 CNetEngine::Send3D(UINT id, CData* data) { if (sockClient[id] != NULL) { /// Envoie de l'id du message /// Recuperer l'exception pour la fermeture précipité du client netArchiveSend[id]->Write(&data->ID,sizeof(int)); TRY { netArchiveSend[id]->Flush(); } CATCH(CArchiveException, e) { sockClient[id]->Close(); delete sockClient[id]; sockClient[id] = NULL; } END_CATCH } if (sockClient[id] != NULL) { /// Envoie de l'objet data->Serialize(*netArchiveSend[id]); TRY { netArchiveSend[id]->Flush(); } CATCH(CArchiveException, e) { sockClient[id]->Close(); delete sockClient[id]; sockClient[id] = NULL; } END_CATCH } }
le probleme est que lorsque je débug, je m appercois que a cette ligne netArchiveSend[id]->Flush(); je rentre dans une exception.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void CSPIDView::OnTimer(UINT nIDEvent) { ..... MaClasse.Send3D(id,&pDoc->Statut); if (MaClasse.GetClient(id) == NULL) { AfxMessageBox("Deconnexion du poste %d",id); MaClasse.CloseSocket(id); } ..... }
Ce que je voudrais c'est que si j arrive pas a flush, alors je ferme la socket et libere la mémoire des variables qui y sont associés.
merci
Partager