[MFC] CSocket ... problème à la fermeture
Salut !
Depuis (très) peu de temps je me suis mis à la programmation réseaux. Je sais qu'il existe un forum spécifique pour le développement réseaux mais d'un autre côté comme je développe sous Visual C++ 6.0 je me suis dit que je devrais peut être poster ma question sur ce forum plutôt que sur l'autre.
Bref, pour me faire la main je développe un serveur echo au sein d'une application de type boîte de dialogue (avec le support socket). J'ai trois classes : CApp, CDlg et CEchoServer.
Ma classe CDlg possède deux CButton (Stop et Start serveur) et une CListBox.
Le fonctionnement désiré est le suivant. L'appui sur START démarre le serveur (si ce n'est pas déjà fait), lequel se met en attente perpétuellement d'une connexion et renvoi le message reçu précédé de <ECHO>. L'appui sur STOP doit arrêter le server.
Le bouton START démarre donc mon serveur ... ou plutôt devrais je dire créé un thread
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
void CEchoServer::Start(int nListeningPort)
{
if( this->m_pThread == NULL )
{
CString szMessage;
this->m_nListeningPortNumber = nListeningPort;
this->m_bServerMustStop = FALSE;
this->m_pThread = AfxBeginThread(DoListen, this);
if( this->m_pThread == NULL )
{
szMessage.Format( "Could not create the server thread" );
AfxMessageBox(szMessage, MB_OK, NULL);
}
}
} |
Le code exécuté dans le thread est le suivant :
Code:
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
|
UINT CEchoServer::DoListen(LPVOID pvParam)
{
CEchoServer* pThis = (CEchoServer*)pvParam;
while( pThis->m_bServerMustStop == FALSE )
{
CString szMessage;
CString szStringToReceive;
CString szStringToSend;
CSocket sockServer;
CSocket sockClient;
sockServer.Create(pThis->m_nListeningPortNumber);
sockServer.Listen();
sockServer.Accept(sockClient);
if( pThis->m_bServerMustStop != TRUE )
{
CSocketFile sockFile(&pThis->m_sockClient);
CArchive archIn(&sockFile, CArchive::load);
CArchive archOut(&sockFile, CArchive::store);
archIn.ReadString(szStringToReceive);
if( szStringToReceive.Compare( "STOP SERVER" ) == 0 )
pThis->m_bServerMustStop = TRUE;
szStringToSend.Format( "ECHO <%s>", szStringToReceive);
archOut.WriteString(szStringToSend);
archOut.Flush();
}
}
pThis->m_pThread = NULL;
return 0;
} |
...
J'en arrive (enfin me direz vous) à mon problème : comment arrêter le serveur ( que dois je faire dans la fonction void CEchoServer::Stop() ) ?
Cas de figure numéro 1 :
Si aucun client n'est connecté, il me semble que le programme sera bloqué à l'appel de la fonction suivante :
Code:
1 2
|
sockServer.Accept(sockClient); |
Dans ce cas comment débloquer la situation depuis la fonction void CEchoServer::Stop() ?
Cas de figure numéro 2 :
Si un client est connecté, il me semble que le programme sera bloqué à l'appel de la fonction suivante :
Code:
1 2
|
archIn.ReadString(szStringToReceive); |
Idem, comment débloquer la situation depuis la fonction void CEchoServer::Stop() ?
Désolé pour "la tartine", j'espère que vous pourrez m'aider. D'avance merci[/code]