Bonjour à tous,
J'ai un problème assez embettant que je n'arrive pas à résoudre... Il concerne les sockets...
Tout d'abord, j'ai créé un serveur en dialog based et un client en MFC, tout fonctionne parfaitement. Par contre, en utilisant le meme code mais avec un serveur en single document, le serveur plante sur la fonction accept() de la socket avec un joli message windows me demandant si je veux envoyer le rapport d'erreur à Microsoft...
J'ai créé une appli MFC Single Document en cochant la check-box 'use Windows Sockets'.
Ensuite, j'ai créé une classe Mon Socket qui hérite de CSocket dont voici le code :
Ensuite, j'implémente mes fonctions indiquées dans la classe C...View de mon appli SDI comme suit :
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 void MonSocket::OnAccept(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class CDametestView* frame = (CDametestView*)AfxGetMainWnd(); frame->TraiterAccept(); CSocket::OnAccept(nErrorCode); } void MonSocket::OnClose(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class CDametestView* frame = (CDametestView*)AfxGetMainWnd(); frame->TraiterClose(); CSocket::OnClose(nErrorCode); } void MonSocket::OnReceive(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class CDametestView* frame = (CDametestView*)AfxGetMainWnd(); frame->TraiterReceive(); CSocket::OnReceive(nErrorCode); }
Voici le constructeur de la classe C...View :
Dans ce qui suit, socketEcoute et socketConnexion sont des objets MonSocket (donc qui héritent de CSocket)
Et les fonctions qui sont renvoyé par la classe MonSocket lors des traitements OnAccept, OnClose et OnReceive sont les suivantes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 CDametestView::CDametestView() { // TODO: add construction code here socketEcoute.Create(40000); socketEcoute.Listen(); }
Lorque je met en marche le serveur puis le client, boum, ca plante et lorsque je passe en mode debug, je vois qu'il bloque à la fonction accept() avec un message "unhandled exception - Access Violation at address 0x0000020"
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 void CDametestView::TraiterAccept() { socketEcoute.Accept(socketConnexion, NULL, NULL ); } void CDametestView::TraiterReceive() { CSocketFile fic(&socketConnexion); CArchive ar(&fic, CArchive::load); CString text; ar >> text; AfxMessageBox(text,0,MB_ICONINFORMATION); } void CDametestView::TraiterClose() { socketConnexion.Close(); }
Si ce problème est déjà survenu à quelqu'un ou si quelqu'un voit une erreur dans mon code, je suis preneur!
Merci d'avance
Laurent.
Partager