[VC++, MFC] Hoe CSockets pollen op gesloten connectie

Pagina: 1
Acties:

  • Ascathon
  • Registratie: Augustus 2004
  • Laatst online: 20-02 12:48
Ten eerste, waar het programma voor is bedoeld kan ik helaas niet zeggen. Mja, stage...maar verder bedrijf en doeleinde kan ik niet vermelden.
Ik werk met MFC in Visual Studio .NET 2003 en mijn probleem ligt bij CSocket.

De situatie:
Ik heb verschillende applicaties, laten we zeggen een "master server" een vijftal "sub servers".
De "master server" heeft tijdens normale werking vijf sockets (CSocket) open. Elk naar één van de "sub servers".
In het dialoog van de "master server" wordt van elke verbinding de status weergegeven.

Het probleem:
Stel, een van de "sub servers" gaat er onderuit. Dus de verbinding wordt verbroken door een fout of gewoon door eenSocket.Close(). Bij de "master server" wordt dan OnClose() getriggerd (dat deze getriggerd wordt is trouwens getest). In deze functie wil ik de status van de sockets in het dialoog wijzigen.
Maar momenteel krijg ik met OnClose() alleen door dat er een socket gesloten is, niet welke. Hoe kan ik (door pollen misschien) uitzoeken welke van de vijf sockets geen connectie meer heeft. Misschien is de oplossing heel simpel, dat is het uiteindelijk wel vaker.
OnClose is een message handler van het framework. Ik weet niet in hoeverre dit veranderd kan worden.

Kind of pseudocode:
C++:
1
2
3
4
5
6
7
void MasterServer::OnClose()
{
   if( eersteSocket verbroken ) wijzig status in dialoog;
   if( tweedeSocket verbroken ) wijzig status in dialoog;
   ...
   if( vijfdeSocket verbroken ) wijzig status in dialoog;
}


Had wel verwacht wat te vinden op codeproject en koders.com maar dat viel tegen. Hopelijk is hier iemand die mij kan helpen.

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 22:59

alienfruit

the alien you never expected

Hmm, is het niet zo dat de socket die de verbinding verliest of gesloten wordt 0 returned? Als data? Geen idee, hoor het is alweer een tijdje geleden dat ik aan networking programming (posix) heb gedaan.
Misschien kan je zelf kijken of je nog berichten kan versturen of ontvangen. Mogelijk heb je wat aan deze bookmark van me:

http://beej.us/guide/bgnet/

[ Voor 57% gewijzigd door alienfruit op 18-05-2006 18:11 ]


  • __fred__
  • Registratie: November 2001
  • Laatst online: 20-02 11:54
Ik neem aan dat je een CSocket inherited hebt om de OnClose te overriden. Vanuit die Onclose kun je de this Pointer Doorpassen naar een andere functie (bijvoorbeeld een owner class ofzo):

C++:
1
2
3
4
void CInheritedSocket::OnClose(int nErrorCode)
{
       mOwner->SocketClosed(this,nErrorCode);
}


C++:
1
2
3
4
5
6
7
8
9
10
11
12
void Owner::SocketClosed(CInheritedSocket* aSocket, int nErrorCode)
{
    if (aSocket == mSocket1)
    {
        bla;
    }
    else if (aSocket == mSocket2)
    {
        bla2;
    }

}

  • Ascathon
  • Registratie: Augustus 2004
  • Laatst online: 20-02 12:48
@ __fred__: Ik denk dat ik hier wel weer mee verder kan. En ik heb inderdaad een inherited klasse van CSocket. De aanpassing heb ik binnen enkele minuten klaar.

@ alienfruit: Die link van gaat over "normale" C++. Die CSocket is meer een Microsoft pakketje om de "normale" socket heen. En waarschijnlijk toegankelijker gemaakt. Toch bedankt voor de link, want ik zal dat zeker nog gaan gebruiken. Bijvoorbeeld het programmeren in Linux waar je het MFC gemak niet hebt.

Het is geworden:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
void Owner::SocketClosed(CInheritedSocket* aSocket, int nErrorCode)
{
    if (aSocket == &mSocket1)
    {
        bla;
    }
    else if (aSocket == &mSocket2)
    {
        bla2;
    }

}

Dus adressen vergelijken. == zou ook kunnen maar dan moet er een operator== gemaakt worden. Zo gaat het ook.

[ Voor 46% gewijzigd door Ascathon op 19-05-2006 09:33 ]


  • __fred__
  • Registratie: November 2001
  • Laatst online: 20-02 11:54
[b][message=25781863,noline]Ascathon schreef op donderdag 18 mei 2006 @ 20:59
Dus adressen vergelijken. == zou ook kunnen maar dan moet er een operator== gemaakt worden. Zo gaat het ook.
Ligt eraan of je mSocket1 als CInheritedSocket* of CInheritedSocket hebt gedefinieerd he ;-)