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 :
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);
}
Ensuite, j'implémente mes fonctions indiquées dans la classe C...View de mon appli SDI comme suit :

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)

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();
}
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
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();
}
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"

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.