Partager via


CSocket, classe

Dérive d' CAsyncSocket, hérite l'encapsulation de l'API Windows Sockets, et représente un niveau d'abstraction que celui d'un objet d' CAsyncSocket .

class CSocket : public CAsyncSocket

Membres

Constructeurs publics

Nom

Description

CSocket::CSocket

Construit un objet CSocket.

Méthodes publiques

Nom

Description

CSocket::Attach

Joint un handle de SOCKET à un objet d' CSocket .

CSocket::CancelBlockingCall

Annule un appel bloquant qui est actuellement en cours.

CSocket::Create

Crée un socket.

CSocket::FromHandle

Retourne un pointeur vers un objet d' CSocket , étant donné un handle de SOCKET .

CSocket::IsBlocking

Détermine si un appel bloquant est en cours.

Méthodes protégées

Nom

Description

CSocket::OnMessagePending

Appelé pour traiter en attente des messages en attendant qu'un appel bloquant se termine.

Notes

CSocket fonctionne avec les classes CSocketFile et CArchive pour gérer l'envoi et la réception de données.

Un objet d' CSocket fournit également le blocage, qui est essentiel pour déboguer synchrone d' CArchive. Bloquant s'exécute, telles que Receive, Send, ReceiveFrom, SendTo, et Accept (tout hérité d' CAsyncSocket), ne retournent pas une erreur d' WSAEWOULDBLOCK dans CSocket. À la place, ces fonctions attendent jusqu'à ce que l'opération se termine. En outre, l'appel d'origine se terminera à l'erreur WSAEINTR si CancelBlockingCall est appelé pendant qu'un de ces fonctions bloque.

Pour utiliser un objet d' CSocket , appelez le constructeur, l'appel Create pour créer le handle sous-jacent d' SOCKET (type SOCKET). Les paramètres par défaut d' Create créent un socket flux, mais si vous n'utilisez pas de socket avec un objet d' CArchive , vous pouvez spécifier un paramètre pour créer un socket datagramme à la place, ou le lier à un port spécifique pour créer un socket de serveur. Connectez -vous à un socket client à l'aide de Connect côté client et Accept côté serveur. Créez ensuite un objet d' CSocketFile et associez -le à l'objet d' CSocket dans le constructeur d' CSocketFile . Ensuite, créez un objet d' CArchive pour envoyer et un pour recevoir les données (si nécessaire), puis associez des avec l'objet d' CSocketFile dans le constructeur d' CArchive . Lorsque les communications sont terminées, détruisez CArchive, CSocketFile, et les objets d' CSocket . Le type de données d' SOCKET est décrite dans l'article Windows Sockets : Arrière-plan.

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
   }
}

Notes

À l'aide de sockets MFC dans les threads secondaires dans une application liée statiquement MFC, vous devez appeler AfxSocketInit dans chaque thread qui utilise des sockets pour initialiser les bibliothèques de socket.Par défaut, AfxSocketInit est appelé uniquement dans le thread principal.

Pour plus d'informations, consultez Windows Sockets dans MFC, Windows Sockets : Utilisation des sockets avec des archives, Windows Sockets : comment les sockets avec des archives fonctionnent, Windows Sockets : Ordre des opérations, Windows Sockets : Exemple de sockets utilisation des archives.

Hiérarchie d'héritage

CObject

CAsyncSocket

CSocket

Configuration requise

en-tête : afxsock.h

Voir aussi

Référence

CAsyncSocket, classe

Graphique de la hiérarchie

CAsyncSocket, classe

CSocketFile, classe