Classe de CSocketFile
Un objet d' CFile utilisé pour envoyer et recevoir des données sur un réseau via Windows Sockets.
class CSocketFile : public CFile
Membres
Constructeurs publics
Nom |
Description |
---|---|
Construit un objet CSocketFile. |
Notes
Vous pouvez lier l'objet d' CSocketFile à un objet d' CSocket à cet effet.Vous pouvez également, et faites habituellement, liaison de l'objet d' CSocketFile à un objet d' CArchive pour simplifier l'émission et des données de recevoir à la sérialisation MFC.
Pour sérialiser (envoyer) de données, vous l'insérer dans l'archive, qui appelle les fonctions membres d' CSocketFile pour écrire des données dans l'objet d' CSocket .Pour désérialiser (recevoir) de données, vous récupérez de l'archive.Cela fait d'appeler l'archive des fonctions membres d' CSocketFile pour lire les données de l'objet d' CSocket .
Conseil |
---|
Outre l'utilisation CSocketFile comme décrit ici, vous pouvez l'utiliser comme fichier objet autonome, de même que vous pouvez à CFile, sa classe de base.Vous pouvez également utiliser CSocketFile avec toutes les fonctions archive- basées de sérialisation MFC.Étant donné qu' CSocketFile ne prend pas en charge toutes les fonctionnalités d'CFile, la valeur par défaut MFC sérialisent des fonctions ne sont pas compatibles avec CSocketFile.c'est particulièrement vrai de la classe d' CEditView .Vous ne devez pas essayer de la sérialisation des données d' CEditView via un objet d' CArchive attaché à un objet d' CSocketFile à l'aide de CEditView::SerializeRaw; utilisation CEditView::Serialize à la place.La fonction d' SerializeRaw s'attend à ce que le fichier objet a des fonctions, telles qu' Seek, qu' CSocketFile n'a pas. |
Lorsque vous utilisez CArchive avec CSocketFile et CSocket, vous pouvez rencontrer une situation où CSocket::Receive écrit une boucle (par PumpMessages(FD_READ)) attend la quantité demandée d'octets.C'est parce que les Winsocks permettent un seul appel de recv par notification de FD_READ, mais CSocketFile et CSocket permettent de plusieurs appels de recv par FD_READ.Si vous obtenez un FD_READ lorsqu'il n'y a pas de données à lire, l'application s'arrête.Si vous n'obtenez jamais un autre FD_READ, l'application arrête de communiquer de socket.
Vous pouvez résoudre ce problème comme suit.Dans la méthode d' OnReceive de votre classe de sockets, appelez CAsyncSocket::IOCtl(FIONREAD, ...) avant d'appeler la méthode d' Serialize de votre classe de message lorsque les données destinées à lire du socket dépassent la taille d'un à en-tête pack TCP (max communication Unit de la prise en charge de réseau, généralement au moins de 1096 octets).Si la taille des données disponibles est moins que nécessaire, attendez que les données à accepter puis démarrez que l'opération de lecture.
Dans l'exemple suivant, m_dwExpected est le nombre d'octets approximatif que l'utilisateur compte recevoir.On suppose que vous le déclarez ailleurs dans votre code.
void CChatSocket::OnReceive(int nErrorCode)
{
CSocket::OnReceive(nErrorCode);
DWORD dwReceived;
if (IOCtl(FIONREAD, &dwReceived))
{
if (dwReceived >= m_dwExpected) // Process only if you have enough data
m_pDoc->ProcessPendingRead();
}
else
{
// Error handling here
}
}
Pour plus d'informations, consultez Windows Sockets dans MFC, Windows Sockets : Utilisation des sockets avec des archives, ainsi que l' API Windows Sockets 2.
Hiérarchie d'héritage
CSocketFile
Configuration requise
Header: afxsock.h