Share via


La classe CAsyncSocket

Représente un socket Windows : point de terminaison de communication réseau.

Syntaxe

class CAsyncSocket : public CObject

Membres

Constructeurs publics

Nom Description
CAsyncSocket::CAsyncSocket Construit un objet CAsyncSocket.

Méthodes publiques

Nom Description
CAsyncSocket::Accept Accepte une connexion sur le socket.
CAsyncSocket::AsyncSelect Demande la notification d’événement pour le socket.
CAsyncSocket::Attach Attache un handle de socket à un CAsyncSocket objet.
CAsyncSocket::Bind Associe une adresse locale au socket.
CAsyncSocket::Close Ferme le socket.
CAsyncSocket::Connect Établit une connexion à un socket homologue.
CAsyncSocket::Create Crée un socket.
CAsyncSocket::CreateEx Crée un socket avec des options avancées.
CAsyncSocket::Detach Détache un handle de socket d’un CAsyncSocket objet.
CAsyncSocket::FromHandle Retourne un pointeur vers un CAsyncSocket objet, en fonction d’un handle de socket.
CAsyncSocket::GetLastError Obtient l’état d’erreur de la dernière opération ayant échoué.
CAsyncSocket::GetPeerName Obtient l’adresse du socket homologue auquel le socket est connecté.
CAsyncSocket::GetPeerNameEx Obtient l’adresse du socket homologue auquel le socket est connecté (gère les adresses IPv6).
CAsyncSocket::GetSockName Obtient le nom local d’un socket.
CAsyncSocket::GetSockNameEx Obtient le nom local d’un socket (gère les adresses IPv6).
CAsyncSocket::GetSockOpt Récupère une option de socket.
CAsyncSocket::IOCtl Contrôle le mode du socket.
CAsyncSocket::Listen Établit un socket pour écouter les demandes de connexion entrantes.
CAsyncSocket::Receive Reçoit les données du socket.
CAsyncSocket::ReceiveFrom Reçoit un datagramme et stocke l’adresse source.
CAsyncSocket::ReceiveFromEx Reçoit un datagramme et stocke l’adresse source (gère les adresses IPv6).
CAsyncSocket::Send Envoie des données à un socket connecté.
CAsyncSocket::SendTo Envoie des données à une destination spécifique.
CAsyncSocket::SendToEx Envoie des données à une destination spécifique (gère les adresses IPv6).
CAsyncSocket::SetSockOpt Définit une option de socket.
CAsyncSocket::ShutDown Send Désactive et/ou Receive appelle le socket.
CASyncSocket::Socket Alloue un handle de socket.

Méthodes protégées

Nom Description
CAsyncSocket::OnAccept Avertit un socket d’écoute qu’il peut accepter les demandes de connexion en attente en appelant Accept.
CAsyncSocket::OnClose Avertit un socket que le socket connecté à celui-ci a fermé.
CAsyncSocket::OnConnect Avertit un socket de connexion que la tentative de connexion est terminée, qu’elle soit réussie ou en erreur.
CAsyncSocket::OnOutOfBandData Avertit un socket de réception qu’il existe des données hors bande à lire sur le socket, généralement un message urgent.
CAsyncSocket::OnReceive Avertit un socket d’écoute qu’il existe des données à récupérer en appelant Receive.
CAsyncSocket::OnSend Avertit un socket qu’il peut envoyer des données en appelant Send.

Opérateurs publics

Nom Description
CAsyncSocket ::operator = Affecte une nouvelle valeur à un CAsyncSocket objet.
CAsyncSocket ::operator SOCKET Utilisez cet opérateur pour récupérer le SOCKET handle de l’objet CAsyncSocket .

Membres de données publics

Nom Description
CAsyncSocket::m_hSocket Indique le SOCKET handle attaché à cet CAsyncSocket objet.

Notes

La classe CAsyncSocket encapsule l’API Windows Socket Functions, fournissant une abstraction orientée objet pour les programmeurs qui souhaitent utiliser Windows Sockets conjointement avec MFC.

Cette classe est basée sur l’hypothèse que vous comprenez les communications réseau. Vous êtes responsable de la gestion des différences de blocage, d’ordre d’octet et des conversions entre des chaînes de jeu de caractères Unicode et multioctets (Mo CS). Si vous souhaitez une interface plus pratique qui gère ces problèmes pour vous, consultez la classe CSocket.

Pour utiliser un CAsyncSocket objet, appelez son constructeur, puis appelez la Create fonction pour créer le handle de socket sous-jacent (type SOCKET), sauf sur les sockets acceptés. Pour un socket de serveur, appelez la Listen fonction membre et, pour un socket client, appelez la Connect fonction membre. Le socket serveur doit appeler la Accept fonction lors de la réception d’une demande de connexion. Utilisez les fonctions restantes CAsyncSocket pour effectuer des communications entre les sockets. À l’achèvement, détruisez l’objet CAsyncSocket s’il a été créé sur le tas ; le destructeur appelle automatiquement la Close fonction. Le SOCKET type de données est décrit dans l’article Windows Sockets : Arrière-plan.

Remarque

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

Pour plus d’informations, consultez Windows Sockets : UtilisationCAsyncSocketde classes et d’articles connexes, ainsi que l’API Windows Sockets 2.

Hiérarchie d'héritage

CObject

CAsyncSocket

Spécifications

En-têteafxsock.h:

CAsyncSocket::Accept

Appelez cette fonction membre pour accepter une connexion sur un socket.

virtual BOOL Accept(
    CAsyncSocket& rConnectedSocket,
    SOCKADDR* lpSockAddr = NULL,
    int* lpSockAddrLen = NULL);

Paramètres

rConnectedSocket
Référence identifiant un nouveau socket disponible pour la connexion.

lpSockAddr
Pointeur vers une SOCKADDR structure qui reçoit l’adresse du socket de connexion, comme connu sur le réseau. Le format exact de l’argument lpSockAddr est déterminé par la famille d’adresses établie lors de la création du socket. Si lpSockAddr et/ou lpSockAddrLen sont égaux, NULLaucune information sur l’adresse distante du socket accepté n’est retournée.

lpSockAddrLen
Pointeur vers la longueur de l’adresse en lpSockAddr octets. Il lpSockAddrLen s’agit d’un paramètre de résultat de valeur : il doit initialement contenir la quantité d’espace pointée par lpSockAddr; sur le retour, il contiendra la longueur réelle (en octets) de l’adresse retournée.

Valeur de retour

Différent de zéro si la fonction réussit ; sinon, 0 et un code d’erreur spécifique peut être récupéré en appelant GetLastError. Les erreurs suivantes s’appliquent à cette fonction membre :

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAEFAULT L’argument lpSockAddrLen est trop petit (inférieur à la taille d’une SOCKADDR structure).

  • WSAEINPROGRESS Un appel Windows Sockets bloquant est en cours.

  • WSAEINVALListen n’a pas été appelé avant d’accepter.

  • WSAEMFILE La file d’attente est vide lors de l’entrée pour accepter et aucun descripteur n’est disponible.

  • WSAENOBUFS Aucun espace tampon n’est disponible.

  • WSAENOTSOCK Le descripteur n’est pas un socket.

  • WSAEOPNOTSUPP Le socket référencé n’est pas un type qui prend en charge le service orienté connexion.

  • WSAEWOULDBLOCK Le socket est marqué comme non bloquant et aucune connexion n’est présente pour être acceptée.

Notes

Cette routine extrait la première connexion dans la file d’attente des connexions en attente, crée un socket avec les mêmes propriétés que ce socket et l’attache .rConnectedSocket Si aucune connexion en attente n’est présente dans la file d’attente, Accept retourne zéro et GetLastError retourne une erreur. Le socket accepté (rConnectedSocket) ne peut pas être utilisé pour accepter davantage de connexions. Le socket d’origine reste ouvert et à l’écoute.

L’argument lpSockAddr est un paramètre de résultat qui est rempli avec l’adresse du socket de connexion, tel qu’appelé couche de communications. Accept est utilisé avec des types de sockets basés sur la connexion, tels que SOCK_STREAM.

CAsyncSocket::AsyncSelect

Appelez cette fonction membre pour demander la notification d’événement pour un socket.

BOOL AsyncSelect(long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

Paramètres

lEvent
Masque de bits qui spécifie une combinaison d’événements réseau dans lesquels l’application est intéressée.

  • FD_READ Vous souhaitez recevoir une notification de préparation à la lecture.

  • FD_WRITE Vous souhaitez recevoir une notification lorsque les données sont disponibles pour être lues.

  • FD_OOB Vous souhaitez recevoir une notification concernant l’arrivée des données hors bande.

  • FD_ACCEPT Vous souhaitez recevoir la notification des connexions entrantes.

  • FD_CONNECT Vous souhaitez recevoir une notification des résultats de connexion.

  • FD_CLOSE Vous souhaitez recevoir une notification lorsqu’un socket a été fermé par un homologue.

Valeur de retour

Différent de zéro si la fonction réussit ; sinon, 0 et un code d’erreur spécifique peut être récupéré en appelant GetLastError. Les erreurs suivantes s’appliquent à cette fonction membre :

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAEINVAL Indique qu’un des paramètres spécifiés n’était pas valide.

  • WSAEINPROGRESS Une opération Windows Sockets bloquante est en cours.

Notes

Cette fonction est utilisée pour spécifier les fonctions de notification de rappel MFC qui seront appelées pour le socket. AsyncSelect définit automatiquement ce socket en mode non bloquant. Pour plus d’informations, consultez l’article Windows Sockets : Notifications de socket.

CAsyncSocket::Attach

Appelez cette fonction membre pour attacher le hSocket handle à un CAsyncSocket objet.

BOOL Attach(
    SOCKET hSocket, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

Paramètres

hSocket
Contient un handle vers un socket.

lEvent
Masque de bits qui spécifie une combinaison d’événements réseau dans lesquels l’application est intéressée.

  • FD_READ Vous souhaitez recevoir une notification de préparation à la lecture.

  • FD_WRITE Vous souhaitez recevoir une notification lorsque les données sont disponibles pour être lues.

  • FD_OOB Vous souhaitez recevoir une notification concernant l’arrivée des données hors bande.

  • FD_ACCEPT Vous souhaitez recevoir la notification des connexions entrantes.

  • FD_CONNECT Vous souhaitez recevoir une notification des résultats de connexion.

  • FD_CLOSE Vous souhaitez recevoir une notification lorsqu’un socket a été fermé par un homologue.

Valeur de retour

Valeur différente de zéro si la fonction aboutit.

Notes

Le SOCKET handle est stocké dans le membre de données de l’objet m_hSocket .

CAsyncSocket::Bind

Appelez cette fonction membre pour associer une adresse locale au socket.

BOOL Bind(
    UINT nSocketPort,
    LPCTSTR lpszSocketAddress = NULL);

BOOL Bind (
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen);

Paramètres

nSocketPort
Port identifiant l’application de socket.

lpszSocketAddress
L’adresse réseau, un nombre en pointillé, tel que « 128.56.22.8 ». Le passage de la NULL chaîne pour ce paramètre indique que l’instance doit écouter l’activité CAsyncSocket du client sur toutes les interfaces réseau.

lpSockAddr
Pointeur vers une SOCKADDR structure qui contient l’adresse à affecter à ce socket.

nSockAddrLen
Longueur de l’adresse en lpSockAddr octets.

Valeur de retour

Différent de zéro si la fonction réussit ; sinon, 0 et un code d’erreur spécifique peut être récupéré en appelant GetLastError. La liste suivante couvre quelques-unes des erreurs qui peuvent être retournées. Pour obtenir une liste complète, consultez Les codes d’erreur des sockets Windows.

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAEADDRINUSE L’adresse spécifiée est déjà utilisée. (Voir l’option SO_REUSEADDR socket sous SetSockOpt.)

  • WSAEFAULT L’argument nSockAddrLen est trop petit (inférieur à la taille d’une SOCKADDR structure).

  • WSAEINPROGRESS Un appel Windows Sockets bloquant est en cours.

  • WSAEAFNOSUPPORT La famille d’adresses spécifiée n’est pas prise en charge par ce port.

  • WSAEINVAL Le socket est déjà lié à une adresse.

  • WSAENOBUFS Mémoires tampons insuffisantes disponibles, trop de connexions.

  • WSAENOTSOCK Le descripteur n’est pas un socket.

Notes

Cette routine est utilisée sur un datagramme ou un socket de flux non connecté, avant les appels ou Listen les suivantsConnect. Avant de pouvoir accepter les demandes de connexion, un socket de serveur d’écoute doit sélectionner un numéro de port et le faire connaître aux sockets Windows en appelant Bind. Bind établit l’association locale (adresse hôte/numéro de port) du socket en affectant un nom local à un socket non nommé.

CAsyncSocket::CAsyncSocket

Construit un objet socket vide.

CAsyncSocket();

Notes

Après avoir construit l’objet, vous devez appeler sa Create fonction membre pour créer la SOCKET structure de données et lier son adresse. (Côté serveur d’une communication Windows Sockets, lorsque le socket d’écoute crée un socket à utiliser dans l’appel Accept , vous n’appelez Create pas ce socket.)

CAsyncSocket::Close

Ferme le socket.

virtual void Close();

Notes

Cette fonction libère le descripteur de socket afin que d’autres références à celui-ci échouent avec l’erreur WSAENOTSOCK. S’il s’agit de la dernière référence au socket sous-jacent, les informations d’affectation de noms associées et les données mises en file d’attente sont dissociées carte. Le destructeur de l’objet socket vous appelle Close .

Pour CAsyncSocket, mais pas pour CSocket, la sémantique de Close sont affectées par les options SO_LINGER de socket et SO_DONTLINGER. Pour plus d’informations, consultez la fonction GetSockOptmembre .

CAsyncSocket::Connect

Appelez cette fonction membre pour établir une connexion à un flux ou un socket de datagramme non connecté.

BOOL Connect(
    LPCTSTR lpszHostAddress,
    UINT nHostPort);

BOOL Connect(
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen);

Paramètres

lpszHostAddress
Adresse réseau du socket auquel cet objet est connecté : un nom d’ordinateur tel que « ftp.microsoft.com » ou un nombre en pointillé tel que « 128.56.22.8 ».

nHostPort
Port identifiant l’application de socket.

lpSockAddr
Pointeur vers une SOCKADDR structure qui contient l’adresse du socket connecté.

nSockAddrLen
Longueur de l’adresse en lpSockAddr octets.

Valeur de retour

Différent de zéro si la fonction réussit ; sinon, 0 et un code d’erreur spécifique peut être récupéré en appelant GetLastError. Si cela indique un code d’erreur et WSAEWOULDBLOCKque votre application utilise les rappels substituables, votre application reçoit un OnConnect message lorsque l’opération de connexion est terminée. Les erreurs suivantes s’appliquent à cette fonction membre :

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAEADDRINUSE L’adresse spécifiée est déjà utilisée.

  • WSAEINPROGRESS Un appel Windows Sockets bloquant est en cours.

  • WSAEADDRNOTAVAIL L’adresse spécifiée n’est pas disponible à partir de l’ordinateur local.

  • WSAEAFNOSUPPORT Les adresses de la famille spécifiée ne peuvent pas être utilisées avec ce socket.

  • WSAECONNREFUSED La tentative de connexion a été rejetée.

  • WSAEDESTADDRREQ Une adresse de destination est requise.

  • WSAEFAULT L’argument nSockAddrLen est incorrect.

  • WSAEINVAL Adresse de l’hôte non valide.

  • WSAEISCONN Le socket est déjà connecté.

  • WSAEMFILE Aucun descripteur de fichier supplémentaire n’est disponible.

  • WSAENETUNREACH Le réseau ne peut pas être atteint à partir de cet hôte pour l’instant.

  • WSAENOBUFS Aucun espace tampon n’est disponible. Le socket ne peut pas être connecté.

  • WSAENOTSOCK Le descripteur n’est pas un socket.

  • WSAETIMEDOUT Essayez de vous connecter sans établir de connexion.

  • WSAEWOULDBLOCK Le socket est marqué comme non bloquant et la connexion ne peut pas être terminée immédiatement.

Notes

Si le socket n’est pas lié, les valeurs uniques sont affectées à l’association locale par le système et le socket est marqué comme lié. Notez que si le champ d’adresse de la structure de noms est tous les zéros, Connect retourne zéro. Pour obtenir des informations d’erreur étendues, appelez la GetLastError fonction membre.

Pour les sockets de flux (type SOCK_STREAM), une connexion active est lancée sur l’hôte étranger. Une fois l’appel de socket terminé, le socket est prêt à envoyer/recevoir des données.

Pour un socket de datagramme (typeSOCK_DGRAM), une destination par défaut est définie, qui sera utilisée lors des appels et Receive suivantsSend.

CAsyncSocket::Create

Appelez la Create fonction membre après avoir construit un objet de socket pour créer le socket Windows et l’attacher.

BOOL Create(
    UINT nSocketPort = 0,
    int nSocketType = SOCK_STREAM,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
    LPCTSTR lpszSocketAddress = NULL);

Paramètres

nSocketPort
Port connu à utiliser avec le socket, ou 0 si vous souhaitez que Les sockets Windows sélectionnent un port.

nSocketType
SOCK_STREAM ou SOCK_DGRAM.

lEvent
Masque de bits qui spécifie une combinaison d’événements réseau dans lesquels l’application est intéressée.

  • FD_READ Vous souhaitez recevoir une notification de préparation à la lecture.

  • FD_WRITE Vous souhaitez recevoir une notification de préparation à l’écriture.

  • FD_OOB Vous souhaitez recevoir une notification concernant l’arrivée des données hors bande.

  • FD_ACCEPT Vous souhaitez recevoir la notification des connexions entrantes.

  • FD_CONNECT Vous souhaitez recevoir une notification de connexion terminée.

  • FD_CLOSE Vous souhaitez recevoir une notification de fermeture de socket.

lpszSockAddress
Pointeur vers une chaîne contenant l’adresse réseau du socket connecté, un nombre en pointillé tel que « 128.56.22.8 ». Le passage de la NULL chaîne pour ce paramètre indique que l’instance doit écouter l’activité CAsyncSocket du client sur toutes les interfaces réseau.

Valeur de retour

Différent de zéro si la fonction réussit ; sinon, 0 et un code d’erreur spécifique peut être récupéré en appelant GetLastError. Les erreurs suivantes s’appliquent à cette fonction membre :

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAEAFNOSUPPORT La famille d’adresses spécifiée n’est pas prise en charge.

  • WSAEINPROGRESS Une opération Windows Sockets bloquante est en cours.

  • WSAEMFILE Aucun descripteur de fichier supplémentaire n’est disponible.

  • WSAENOBUFS Aucun espace tampon n’est disponible. Impossible de créer le socket.

  • WSAEPROTONOSUPPORT Le port spécifié n’est pas pris en charge.

  • WSAEPROTOTYPE Le port spécifié est le type incorrect pour ce socket.

  • WSAESOCKTNOSUPPORT Le type de socket spécifié n’est pas pris en charge dans cette famille d’adresses.

Notes

Create appelle Socket et, si elle réussit, elle appelle Bind pour lier le socket à l’adresse spécifiée. Les types de sockets suivants sont pris en charge :

  • SOCK_STREAM Fournit des flux d’octets séquencés, fiables, duplex complets et basés sur des octets. Utilise le protocole TCP (Transmission Control Protocol) pour la famille d’adresses Internet.

  • SOCK_DGRAM Prend en charge les datagrammes, qui sont des paquets non fiables d’une longueur maximale fixe (généralement petite). Utilise le protocole UDP (User Datagram Protocol) pour la famille d’adresses Internet.

    Remarque

    La Accept fonction membre prend une référence à un nouvel objet vide CSocket comme paramètre. Vous devez construire cet objet avant d’appeler Accept. N’oubliez pas que si cet objet socket sort de l’étendue, la connexion se ferme. N’appelez Create pas ce nouvel objet socket.

Important

Create n’est pas thread‑safe. Si vous l’appelez dans un environnement multithread où il peut être appelé simultanément par différents threads, veillez à protéger chaque appel avec un mutex ou un autre verrou de synchronisation.

Pour plus d’informations sur les sockets de flux et de datagramme, consultez les articles Windows Sockets : Arrière-plan et Sockets Windows : Ports et adresses de socket et API Windows Sockets 2.

CAsyncSocket::CreateEx

Appelez la CreateEx fonction membre après avoir construit un objet de socket pour créer le socket Windows et l’attacher.

Utilisez cette fonction lorsque vous devez fournir des options avancées telles que le type de socket.

BOOL CreateEx(
    ADDRINFOT* pAI,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

Paramètres

pAI
Pointeur vers un ADDRINFOT pointeur pour contenir des informations de socket telles que la famille et le type de socket.

lEvent
Masque de bits qui spécifie une combinaison d’événements réseau dans lesquels l’application est intéressée.

  • FD_READ Vous souhaitez recevoir une notification de préparation à la lecture.

  • FD_WRITE Vous souhaitez recevoir une notification de préparation à l’écriture.

  • FD_OOB Vous souhaitez recevoir une notification concernant l’arrivée des données hors bande.

  • FD_ACCEPT Vous souhaitez recevoir la notification des connexions entrantes.

  • FD_CONNECT Vous souhaitez recevoir une notification de connexion terminée.

  • FD_CLOSE Vous souhaitez recevoir une notification de fermeture de socket.

Valeur de retour

Consultez la valeur de retour pour Create().

Notes

Consultez les remarques pour Create().

CAsyncSocket::Detach

Appelez cette fonction membre pour détacher le SOCKET handle du m_hSocket membre de données de l’objet CAsyncSocket et définir m_hSocket sur NULL.

SOCKET Detach();

CAsyncSocket::FromHandle

Retourne un pointeur vers un CAsyncSocket objet.

static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);

Paramètres

hSocket
Contient un handle vers un socket.

Valeur de retour

Pointeur vers un CAsyncSocket objet, ou NULL s’il n’y a pas CAsyncSocket d’objet attaché à hSocket.

Notes

Lorsqu’un SOCKET handle est donné, si un CAsyncSocket objet n’est pas attaché au handle, la fonction membre retourne NULL.

CAsyncSocket::GetLastError

Appelez cette fonction membre pour obtenir l’état d’erreur de la dernière opération ayant échoué.

static int PASCAL GetLastError();

Valeur de retour

La valeur de retour indique le code d’erreur de la dernière routine d’API Windows Sockets effectuée par ce thread.

Notes

Lorsqu’une fonction membre particulière indique qu’une erreur s’est produite, GetLastError doit être appelée pour récupérer le code d’erreur approprié. Consultez les descriptions des fonctions membres individuelles pour obtenir la liste des codes d’erreur applicables.

Pour plus d’informations sur les codes d’erreur, consultez l’API Windows Sockets 2.

CAsyncSocket::GetPeerName

Appelez cette fonction membre pour obtenir l’adresse du socket homologue auquel ce socket est connecté.

BOOL GetPeerName(
    CString& rPeerAddress,
    UINT& rPeerPort);

BOOL GetPeerName(
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen);

Paramètres

rPeerAddress
Référence à un CString objet qui reçoit une adresse IP de nombre en pointillés.

rPeerPort
Référence à un UINT port qui stocke un port.

lpSockAddr
Pointeur vers la SOCKADDR structure qui reçoit le nom du socket homologue.

lpSockAddrLen
Pointeur vers la longueur de l’adresse en lpSockAddr octets. Lors du retour, l’argument lpSockAddrLen contient la taille réelle retournée lpSockAddr en octets.

Valeur de retour

Différent de zéro si la fonction réussit ; sinon, 0 et un code d’erreur spécifique peut être récupéré en appelant GetLastError. Les erreurs suivantes s’appliquent à cette fonction membre :

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAEFAULT L’argument lpSockAddrLen n’est pas assez grand.

  • WSAEINPROGRESS Un appel Windows Sockets bloquant est en cours.

  • WSAENOTCONN Le socket n’est pas connecté.

  • WSAENOTSOCK Le descripteur n’est pas un socket.

Notes

Pour gérer les adresses IPv6, utilisez CAsyncSocket::GetPeerNameEx.

CAsyncSocket::GetPeerNameEx

Appelez cette fonction membre pour obtenir l’adresse du socket homologue auquel ce socket est connecté (gère les adresses IPv6).

BOOL GetPeerNameEx(
    CString& rPeerAddress,
    UINT& rPeerPort);

Paramètres

rPeerAddress
Référence à un CString objet qui reçoit une adresse IP de nombre en pointillés.

rPeerPort
Référence à un UINT port qui stocke un port.

Valeur de retour

Différent de zéro si la fonction réussit ; sinon, 0 et un code d’erreur spécifique peut être récupéré en appelant GetLastError. Les erreurs suivantes s’appliquent à cette fonction membre :

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAEFAULT L’argument lpSockAddrLen n’est pas assez grand.

  • WSAEINPROGRESS Un appel Windows Sockets bloquant est en cours.

  • WSAENOTCONN Le socket n’est pas connecté.

  • WSAENOTSOCK Le descripteur n’est pas un socket.

Notes

Cette fonction est la même que CAsyncSocket::GetPeerName celle qui gère les adresses IPv6 ainsi que les protocoles plus anciens.

CAsyncSocket::GetSockName

Appelez cette fonction membre pour obtenir le nom local d’un socket.

BOOL GetSockName(
    CString& rSocketAddress,
    UINT& rSocketPort);

BOOL GetSockName(
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen);

Paramètres

rSocketAddress
Référence à un CString objet qui reçoit une adresse IP de nombre en pointillés.

rSocketPort
Référence à un UINT port qui stocke un port.

lpSockAddr
Pointeur vers une SOCKADDR structure qui reçoit l’adresse du socket.

lpSockAddrLen
Pointeur vers la longueur de l’adresse en lpSockAddr octets.

Valeur de retour

Différent de zéro si la fonction réussit ; sinon, 0 et un code d’erreur spécifique peut être récupéré en appelant GetLastError. Les erreurs suivantes s’appliquent à cette fonction membre :

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAEFAULT L’argument lpSockAddrLen n’est pas assez grand.

  • WSAEINPROGRESS Une opération Windows Sockets bloquante est en cours.

  • WSAENOTSOCK Le descripteur n’est pas un socket.

  • WSAEINVAL Le socket n’a pas été lié à une adresse avec Bind.

Notes

Cet appel est particulièrement utile lorsqu’un Connect appel a été effectué sans effectuer d’abord Bind  ; cet appel fournit le seul moyen par lequel vous pouvez déterminer l’association locale qui a été définie par le système.

Pour gérer les adresses IPv6, utilisez CAsyncSocket::GetSockNameEx

CAsyncSocket::GetSockNameEx

Appelez cette fonction membre pour obtenir le nom local d’un socket (gère les adresses IPv6).

BOOL GetSockNameEx(
    CString& rSocketAddress,
    UINT& rSocketPort);

Paramètres

rSocketAddress
Référence à un CString objet qui reçoit une adresse IP de nombre en pointillés.

rSocketPort
Référence à un UINT port qui stocke un port.

Valeur de retour

Différent de zéro si la fonction réussit ; sinon, 0 et un code d’erreur spécifique peut être récupéré en appelant GetLastError. Les erreurs suivantes s’appliquent à cette fonction membre :

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAEFAULT L’argument lpSockAddrLen n’est pas assez grand.

  • WSAEINPROGRESS Une opération Windows Sockets bloquante est en cours.

  • WSAENOTSOCK Le descripteur n’est pas un socket.

  • WSAEINVAL Le socket n’a pas été lié à une adresse avec Bind.

Notes

Cet appel est identique à celui CAsyncSocket::GetSockName qu’il gère les adresses IPv6 ainsi que les protocoles plus anciens.

Cet appel est particulièrement utile lorsqu’un Connect appel a été effectué sans effectuer d’abord Bind  ; cet appel fournit le seul moyen par lequel vous pouvez déterminer l’association locale qui a été définie par le système.

CAsyncSocket::GetSockOpt

Appelez cette fonction membre pour récupérer une option de socket.

BOOL GetSockOpt(
    int nOptionName,
    void* lpOptionValue,
    int* lpOptionLen,
    int nLevel = SOL_SOCKET);

Paramètres

nOptionName
Option de socket pour laquelle la valeur doit être récupérée.

lpOptionValue
Pointeur vers la mémoire tampon dans laquelle la valeur de l’option demandée doit être retournée. La valeur associée à l’option sélectionnée est retournée dans la mémoire tampon lpOptionValue. L’entier pointé par lpOptionLen doit contenir à l’origine la taille de cette mémoire tampon en octets ; et à retour, il sera défini sur la taille de la valeur retournée. Pour SO_LINGER, il s’agit de la taille d’une LINGER structure ; pour toutes les autres options, il s’agit de la taille d’un BOOL ou d’un int, en fonction de l’option. Consultez la liste des options et leurs tailles dans la section Remarques.

lpOptionLen
Pointeur vers la taille de la lpOptionValue mémoire tampon en octets.

nLevel
Niveau auquel l’option est définie ; les seuls niveaux pris en charge sont SOL_SOCKET et IPPROTO_TCP.

Valeur de retour

Différent de zéro si la fonction réussit ; sinon, 0 et un code d’erreur spécifique peut être récupéré en appelant GetLastError. Si une option n’a jamais été définie avec SetSockOpt, GetSockOpt retourne la valeur par défaut de l’option. Les erreurs suivantes s’appliquent à cette fonction membre :

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAEFAULT L’argument lpOptionLen n’était pas valide.

  • WSAEINPROGRESS Une opération Windows Sockets bloquante est en cours.

  • WSAENOPROTOOPT L’option est inconnue ou non prise en charge. En particulier, SO_BROADCAST n’est pas pris en charge sur les sockets de type SOCK_STREAM, tandis que SO_ACCEPTCONN, SO_DONTLINGER, SO_KEEPALIVE, SO_LINGERet SO_OOBINLINE ne sont pas pris en charge sur les sockets de type SOCK_DGRAM.

  • WSAENOTSOCK Le descripteur n’est pas un socket.

Notes

GetSockOpt récupère la valeur actuelle d’une option de socket associée à un socket de n’importe quel type, dans n’importe quel état et stocke le résultat dans lpOptionValue. Les options affectent les opérations de socket, telles que le routage des paquets, le transfert de données hors bande, etc.

Les options suivantes sont prises en charge pour GetSockOpt. Le type identifie le type de données traitées par lpOptionValue. L’option TCP_NODELAY utilise le niveau IPPROTO_TCP; toutes les autres options utilisent le niveau SOL_SOCKET.

Valeur Type Signification
SO_ACCEPTCONN BOOL Le socket est à l’écoute.
SO_BROADCAST BOOL Le socket est configuré pour la transmission de messages de diffusion.
SO_DEBUG BOOL Le débogage est activé.
SO_DONTLINGER BOOL Si la valeur est true, l’option SO_LINGER est désactivée.
SO_DONTROUTE BOOL Le routage est désactivé.
SO_ERROR int Récupérer l’état d’erreur et effacer.
SO_KEEPALIVE BOOL Les maintiens en vie sont envoyés.
SO_LINGER struct LINGER Retourne les options de persistance actuelles.
SO_OOBINLINE BOOL Les données hors bande sont reçues dans le flux de données normal.
SO_RCVBUF int Taille de la mémoire tampon pour les réceptions.
SO_REUSEADDR BOOL Le socket peut être lié à une adresse déjà utilisée.
SO_SNDBUF int Taille de la mémoire tampon pour les envois.
SO_TYPE int Type du socket (par exemple, SOCK_STREAM).
TCP_NODELAY BOOL Désactive l'algorithme Nagle pour la fusion des envois.

Les options BSD (Berkeley Software Distribution) non prises en charge sont GetSockOpt les suivantes :

Valeur Type Signification
SO_RCVLOWAT int Recevoir une marque d’eau faible.
SO_RCVTIMEO int Délai d’expiration de réception.
SO_SNDLOWAT int Envoyez une marque d’eau faible.
SO_SNDTIMEO int Délai d’attente d’envoi.
IP_OPTIONS Obtenir les options dans l’en-tête IP.
TCP_MAXSEG int Obtenir la taille maximale du segment TCP.

L’appel GetSockOpt avec une option non prise en charge entraîne le renvoi d’un code d’erreur à partir de WSAENOPROTOOPTGetLastError.

CAsyncSocket::IOCtl

Appelez cette fonction membre pour contrôler le mode d’un socket.

BOOL IOCtl(
    long lCommand,
    DWORD* lpArgument);

Paramètres

lCommand
Commande à exécuter sur le socket.

lpArgument
Pointeur vers un paramètre pour lCommand.

Valeur de retour

Différent de zéro si la fonction réussit ; sinon, 0 et un code d’erreur spécifique peut être récupéré en appelant GetLastError. Les erreurs suivantes s’appliquent à cette fonction membre :

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAEINVALlCommand n’est pas une commande valide ou lpArgument n’est pas un paramètre acceptable pour lCommand, ou la commande n’est pas applicable au type de socket fourni.

  • WSAEINPROGRESS Une opération Windows Sockets bloquante est en cours.

  • WSAENOTSOCK Le descripteur n’est pas un socket.

Notes

Cette routine peut être utilisée sur n’importe quel socket dans n’importe quel état. Il est utilisé pour obtenir ou récupérer des paramètres d’exploitation associés au socket, indépendamment du sous-système de protocole et de communication. Les commandes suivantes sont prises en charge :

  • FIONBIO Activez ou désactivez le mode non bloquant sur le socket. Le lpArgument paramètre pointe à un DWORDpoint différent de zéro si le mode non bloquant doit être activé et zéro s’il doit être désactivé. Si AsyncSelect elle a été émise sur un socket, toute tentative d’utilisation IOCtl pour définir le socket sur le mode de blocage échoue avec WSAEINVAL. Pour réactiver le socket en mode bloquant et empêcher l’erreur WSAEINVAL , une application doit d’abord la désactiver AsyncSelect en appelant AsyncSelect avec le lEvent paramètre égal à 0, puis appeler IOCtl.

  • FIONREAD Déterminez le nombre maximal d’octets pouvant être lus avec un Receive appel à partir de ce socket. Le lpArgument paramètre pointe vers un DWORD point dans lequel IOCtl stocke le résultat. Si ce socket est de type SOCK_STREAM, FIONREAD retourne la quantité totale de données qui peuvent être lues dans un seul Receive; cela est normalement identique à la quantité totale de données mises en file d’attente sur le socket. Si ce socket est de type SOCK_DGRAM, FIONREAD retourne la taille du premier datagramme mis en file d’attente sur le socket.

  • SIOCATMARK Déterminez si toutes les données hors bande ont été lues. Cela s’applique uniquement à un socket de type SOCK_STREAM qui a été configuré pour la réception en ligne de toutes les données hors bande ( SO_OOBINLINE). Si aucune donnée hors bande n’attend la lecture, l’opération retourne une valeur différente de zéro. Sinon, elle retourne 0, et la suivante Receive ou ReceiveFrom effectuée sur le socket récupère certaines ou toutes les données précédant la « marque » ; l’application doit utiliser l’opération SIOCATMARK pour déterminer si des données restent. Si des données normales précèdent les données « urgentes » (hors bande), elles sont reçues dans l’ordre. (Notez qu’un Receive ou ReceiveFrom ne mélange jamais les données hors bande et normales dans le même appel.) Le lpArgument paramètre pointe vers un DWORD point dans lequel IOCtl stocke le résultat.

Cette fonction est un sous-ensemble utilisé ioctl() dans les sockets De Berkeley. En particulier, il n’existe aucune commande équivalente à FIOASYNC, tandis que SIOCATMARK la seule commande au niveau du socket prise en charge.

CAsyncSocket::Listen

Appelez cette fonction membre pour écouter les demandes de connexion entrantes.

BOOL Listen(int nConnectionBacklog = 5);

Paramètres

nConnectionBacklog
Longueur maximale jusqu’à laquelle la file d’attente des connexions en attente peut croître. La plage valide est comprise entre 1 et 5.

Valeur de retour

Différent de zéro si la fonction réussit ; sinon, 0 et un code d’erreur spécifique peut être récupéré en appelant GetLastError. Les erreurs suivantes s’appliquent à cette fonction membre :

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAEADDRINUSE Une tentative a été effectuée pour écouter une adresse en cours d’utilisation.

  • WSAEINPROGRESS Une opération Windows Sockets bloquante est en cours.

  • WSAEINVAL Le socket n’a pas été lié Bind ou est déjà connecté.

  • WSAEISCONN Le socket est déjà connecté.

  • WSAEMFILE Aucun descripteur de fichier supplémentaire n’est disponible.

  • WSAENOBUFS Aucun espace tampon n’est disponible.

  • WSAENOTSOCK Le descripteur n’est pas un socket.

  • WSAEOPNOTSUPP Le socket référencé n’est pas d’un type qui prend en charge l’opération Listen .

Notes

Pour accepter les connexions, le socket est créé en premier avec Create, un backlog pour les connexions entrantes est spécifié avec Listen, puis les connexions sont acceptées avec Accept. Listen s’applique uniquement aux sockets qui prennent en charge les connexions, c’est-à-dire celles de type SOCK_STREAM. Ce socket est placé en mode « passif » où les connexions entrantes sont reconnues et mises en file d’attente en attente d’acceptation par le processus.

Cette fonction est généralement utilisée par les serveurs (ou toute application qui souhaite accepter les connexions) qui peuvent avoir plusieurs demandes de connexion à la fois : si une demande de connexion arrive avec la file d’attente complète, le client reçoit une erreur indiquant .WSAECONNREFUSED

Listen tente de continuer à fonctionner de manière rationnelle lorsqu’il n’existe aucun port disponible (descripteurs). Elle accepte les connexions jusqu’à ce que la file d’attente soit vidée. Si les ports deviennent disponibles, un appel ultérieur vers Listen ou Accept rechargera la file d’attente vers le « backlog » actuel ou le plus récent, et reprendra l’écoute des connexions entrantes.

CAsyncSocket::m_hSocket

Contient le SOCKET handle du socket encapsulé par cet CAsyncSocket objet.

SOCKET m_hSocket;

CAsyncSocket::OnAccept

Appelé par l’infrastructure pour notifier un socket d’écoute qu’il peut accepter les demandes de connexion en attente en appelant la Accept fonction membre.

virtual void OnAccept(int nErrorCode);

Paramètres

nErrorCode
Erreur la plus récente sur un socket. Les codes d’erreur suivants s’appliquent à la OnAccept fonction membre :

  • 0 La fonction a été exécutée avec succès.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

Notes

Pour plus d’informations, consultez Windows Sockets : Notifications de socket.

CAsyncSocket::OnClose

Appelé par l’infrastructure pour notifier ce socket que le socket connecté est fermé par son processus.

virtual void OnClose(int nErrorCode);

Paramètres

nErrorCode
Erreur la plus récente sur un socket. Les codes d’erreur suivants s’appliquent à la OnClose fonction membre :

  • 0 La fonction a été exécutée avec succès.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAECONNRESET La connexion a été réinitialisée par le côté distant.

  • WSAECONNABORTED La connexion a été abandonnée en raison d’un délai d’expiration ou d’un autre échec.

Notes

Pour plus d’informations, consultez Windows Sockets : Notifications de socket.

CAsyncSocket::OnConnect

Appelé par l’infrastructure pour avertir ce socket de connexion que sa tentative de connexion est terminée, qu’il soit réussi ou en erreur.

virtual void OnConnect(int nErrorCode);

Paramètres

nErrorCode
Erreur la plus récente sur un socket. Les codes d’erreur suivants s’appliquent à la OnConnect fonction membre :

  • 0 La fonction a été exécutée avec succès.

  • WSAEADDRINUSE L’adresse spécifiée est déjà utilisée.

  • WSAEADDRNOTAVAIL L’adresse spécifiée n’est pas disponible à partir de l’ordinateur local.

  • WSAEAFNOSUPPORT Les adresses de la famille spécifiée ne peuvent pas être utilisées avec ce socket.

  • WSAECONNREFUSED La tentative de connexion a été rejetée avec force.

  • WSAEDESTADDRREQ Une adresse de destination est requise.

  • WSAEFAULT L’argument lpSockAddrLen est incorrect.

  • WSAEINVAL Le socket est déjà lié à une adresse.

  • WSAEISCONN Le socket est déjà connecté.

  • WSAEMFILE Aucun descripteur de fichier supplémentaire n’est disponible.

  • WSAENETUNREACH Le réseau ne peut pas être atteint à partir de cet hôte pour l’instant.

  • WSAENOBUFS Aucun espace tampon n’est disponible. Le socket ne peut pas être connecté.

  • WSAENOTCONN Le socket n’est pas connecté.

  • WSAENOTSOCK Le descripteur est un fichier, et non un socket.

  • WSAETIMEDOUT Tentative de connexion expirée sans établir de connexion.

Notes

Remarque

Dans CSocket, la OnConnect fonction de notification n’est jamais appelée. Pour les connexions, vous appelez Connectsimplement , qui retourne une fois la connexion terminée (avec succès ou en erreur). La façon dont les notifications de connexion sont gérées est un détail d’implémentation MFC.

Pour plus d’informations, consultez Windows Sockets : Notifications de socket.

Exemple

void CMyAsyncSocket::OnConnect(int nErrorCode) // CMyAsyncSocket is
                                               // derived from CAsyncSocket
{
   if (0 != nErrorCode)
   {
      switch (nErrorCode)
      {
      case WSAEADDRINUSE:
         AfxMessageBox(_T("The specified address is already in use.\n"));
         break;
      case WSAEADDRNOTAVAIL:
         AfxMessageBox(_T("The specified address is not available from ")
                       _T("the local machine.\n"));
         break;
      case WSAEAFNOSUPPORT:
         AfxMessageBox(_T("Addresses in the specified family cannot be ")
                       _T("used with this socket.\n"));
         break;
      case WSAECONNREFUSED:
         AfxMessageBox(_T("The attempt to connect was forcefully rejected.\n"));
         break;
      case WSAEDESTADDRREQ:
         AfxMessageBox(_T("A destination address is required.\n"));
         break;
      case WSAEFAULT:
         AfxMessageBox(_T("The lpSockAddrLen argument is incorrect.\n"));
         break;
      case WSAEINVAL:
         AfxMessageBox(_T("The socket is already bound to an address.\n"));
         break;
      case WSAEISCONN:
         AfxMessageBox(_T("The socket is already connected.\n"));
         break;
      case WSAEMFILE:
         AfxMessageBox(_T("No more file descriptors are available.\n"));
         break;
      case WSAENETUNREACH:
         AfxMessageBox(_T("The network cannot be reached from this host ")
                       _T("at this time.\n"));
         break;
      case WSAENOBUFS:
         AfxMessageBox(_T("No buffer space is available. The socket ")
                       _T("cannot be connected.\n"));
         break;
      case WSAENOTCONN:
         AfxMessageBox(_T("The socket is not connected.\n"));
         break;
      case WSAENOTSOCK:
         AfxMessageBox(_T("The descriptor is a file, not a socket.\n"));
         break;
      case WSAETIMEDOUT:
         AfxMessageBox(_T("The attempt to connect timed out without ")
                       _T("establishing a connection. \n"));
         break;
      default:
         TCHAR szError[256];
         _stprintf_s(szError, _T("OnConnect error: %d"), nErrorCode);
         AfxMessageBox(szError);
         break;
      }
      AfxMessageBox(_T("Please close the application"));
   }
   CAsyncSocket::OnConnect(nErrorCode);
}

CAsyncSocket::OnOutOfBandData

Appelé par l’infrastructure pour avertir le socket de réception que le socket d’envoi a des données hors bande à envoyer.

virtual void OnOutOfBandData(int nErrorCode);

Paramètres

nErrorCode
Erreur la plus récente sur un socket. Les codes d’erreur suivants s’appliquent à la OnOutOfBandData fonction membre :

  • 0 La fonction a été exécutée avec succès.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

Notes

Les données hors bande sont un canal indépendant logiquement associé à chaque paire de sockets connectés de type SOCK_STREAM. Le canal est généralement utilisé pour envoyer des données urgentes.

MFC prend en charge les données hors bande, mais les utilisateurs de classe CAsyncSocket sont déconseillés de l’utiliser. La façon la plus simple consiste à créer un deuxième socket pour transmettre ces données. Pour plus d’informations sur les données hors bande, consultez Windows Sockets : Notifications de sockets.

CAsyncSocket::OnReceive

Appelé par l’infrastructure pour notifier ce socket qu’il existe des données dans la mémoire tampon qui peuvent être récupérées en appelant la Receive fonction membre.

virtual void OnReceive(int nErrorCode);

Paramètres

nErrorCode
Erreur la plus récente sur un socket. Les codes d’erreur suivants s’appliquent à la OnReceive fonction membre :

  • 0 La fonction a été exécutée avec succès.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

Notes

Pour plus d’informations, consultez Windows Sockets : Notifications de socket.

Exemple

void CMyAsyncSocket::OnReceive(int nErrorCode) // CMyAsyncSocket is
                                               // derived from CAsyncSocket
{
  static int i = 0;

  i++;

  TCHAR buff[4096];
  int nRead;
  nRead = Receive(buff, 4096);

  switch (nRead)
  {
  case 0:
    Close();
    break;
  case SOCKET_ERROR:
    if (GetLastError() != WSAEWOULDBLOCK)
    {
      AfxMessageBox(_T("Error occurred"));
      Close();
    }
    break;
  default:
    buff[nRead] = _T('\0'); //terminate the string
    CString szTemp(buff);
    m_strRecv += szTemp; // m_strRecv is a CString declared
                         // in CMyAsyncSocket
    if (szTemp.CompareNoCase(_T("bye")) == 0)
    {
      ShutDown();
      s_eventDone.SetEvent();
    }
  }
  CAsyncSocket::OnReceive(nErrorCode);
}

CAsyncSocket::OnSend

Appelé par l’infrastructure pour notifier le socket qu’il peut désormais envoyer des données en appelant la Send fonction membre.

virtual void OnSend(int nErrorCode);

Paramètres

nErrorCode
Erreur la plus récente sur un socket. Les codes d’erreur suivants s’appliquent à la OnSend fonction membre :

  • 0 La fonction a été exécutée avec succès.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

Notes

Pour plus d’informations, consultez Windows Sockets : Notifications de socket.

Exemple

// CMyAsyncSocket is derived from CAsyncSocket and defines the
// following variables:
//    CString  m_sendBuffer;   //for async send
//    int      m_nBytesSent;
//    int      m_nBytesBufferSize;
void CMyAsyncSocket::OnSend(int nErrorCode)
{
   while (m_nBytesSent < m_nBytesBufferSize)
   {
      int dwBytes;

      if ((dwBytes = Send((LPCTSTR)m_sendBuffer + m_nBytesSent,
                          m_nBytesBufferSize - m_nBytesSent)) == SOCKET_ERROR)
      {
         if (GetLastError() == WSAEWOULDBLOCK)
         {
            break;
         }
         else
         {
            TCHAR szError[256];
            _stprintf_s(szError, _T("Server Socket failed to send: %d"),
                        GetLastError());
            Close();
            AfxMessageBox(szError);
         }
      }
      else
      {
         m_nBytesSent += dwBytes;
      }
   }

   if (m_nBytesSent == m_nBytesBufferSize)
   {
      m_nBytesSent = m_nBytesBufferSize = 0;
      m_sendBuffer = _T("");
   }

   CAsyncSocket::OnSend(nErrorCode);
}

CAsyncSocket::operator =

Affecte une nouvelle valeur à un CAsyncSocket objet.

void operator=(const CAsyncSocket& rSrc);

Paramètres

rSrc
Référence à un objet existant CAsyncSocket .

Notes

Appelez cette fonction pour copier un objet existant CAsyncSocket vers un autre CAsyncSocket objet.

CAsyncSocket::operator SOCKET

Utilisez cet opérateur pour récupérer le SOCKET handle de l’objet CAsyncSocket .

operator SOCKET() const;

Valeur de retour

En cas de réussite, le handle de l’objet SOCKET ; sinon, NULL.

Notes

Vous pouvez utiliser le handle pour appeler directement les API Windows.

CAsyncSocket::Receive

Appelez cette fonction membre pour recevoir des données d’un socket.

virtual int Receive(
    void* lpBuf,
    int nBufLen,
    int nFlags = 0);

Paramètres

lpBuf
Mémoire tampon pour les données entrantes.

nBufLen
Longueur en lpBuf octets.

nFlags
Spécifie la façon dont l’appel est effectué. La sémantique de cette fonction est déterminée par les options de socket et le nFlags paramètre. Ce dernier est construit en combinant l’une des valeurs suivantes avec l’opérateur OR au niveau du bit C++ (|) :

  • MSG_PEEK Examinez les données entrantes. Les données sont copiées dans la mémoire tampon, mais elles ne sont pas supprimées de la file d’attente d’entrée.

  • MSG_OOB Traitez les données hors bande.

Valeur de retour

Si aucune erreur ne se produit, Receive retourne le nombre d’octets reçus. Si la connexion a été fermée, elle retourne 0. Sinon, une valeur est SOCKET_ERROR retournée et un code d’erreur spécifique peut être récupéré en appelant GetLastError. Les erreurs suivantes s’appliquent à cette fonction membre :

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAENOTCONN Le socket n’est pas connecté.

  • WSAEINPROGRESS Une opération Windows Sockets bloquante est en cours.

  • WSAENOTSOCK Le descripteur n’est pas un socket.

  • WSAEOPNOTSUPPMSG_OOB a été spécifié, mais le socket n’est pas de type SOCK_STREAM.

  • WSAESHUTDOWN Le socket a été arrêté ; il n’est pas possible d’appeler Receive un socket après ShutDown avoir été appelé avec nHow la valeur 0 ou 2.

  • WSAEWOULDBLOCK Le socket est marqué comme non bloquant et l’opération Receive bloquerait.

  • WSAEMSGSIZE Le datagramme était trop volumineux pour s’adapter à la mémoire tampon spécifiée et a été tronqué.

  • WSAEINVAL Le socket n’a pas été lié avec Bind.

  • WSAECONNABORTED Le circuit virtuel a été abandonné en raison d’un délai d’expiration ou d’une autre défaillance.

  • WSAECONNRESET Le circuit virtuel a été réinitialisé par le côté distant.

Notes

Cette fonction est utilisée pour les sockets de flux ou de datagramme connectés et est utilisée pour lire les données entrantes.

Pour les sockets de type SOCK_STREAM, autant d’informations que celles actuellement disponibles jusqu’à la taille de la mémoire tampon fournie est retournée. Si le socket a été configuré pour la réception en ligne des données hors bande (option SO_OOBINLINEde socket) et que les données hors bande ne sont pas lus, seules les données hors bande sont retournées. L’application peut utiliser l’option IOCtlSIOCATMARK ou OnOutOfBandData déterminer si des données hors bande restent à lire.

Pour les sockets de datagramme, les données sont extraites du premier datagramme mis en file d’attente, jusqu’à la taille de la mémoire tampon fournie. Si le datagramme est supérieur à la mémoire tampon fournie, la mémoire tampon est remplie avec la première partie du datagramme, les données excédentaires sont perdues et Receive retourne une valeur avec SOCKET_ERROR le code d’erreur défini sur WSAEMSGSIZE. Si aucune donnée entrante n’est disponible sur le socket, une valeur de SOCKET_ERROR celle-ci est retournée avec le code d’erreur défini sur WSAEWOULDBLOCK. La OnReceive fonction de rappel peut être utilisée pour déterminer quand plus de données arrivent.

Si le socket est de type SOCK_STREAM et que le côté distant a arrêté la connexion correctement, une Receive opération se termine immédiatement avec 0 octets reçus. Si la connexion a été réinitialisée, une Receive erreur WSAECONNRESETéchoue.

Receive doit être appelé une seule fois pour chaque fois CAsyncSocket::OnReceive .

Exemple

Consultez l’exemple pour CAsyncSocket::OnReceive.

CAsyncSocket::ReceiveFrom

Appelez cette fonction membre pour recevoir un datagramme et stocker l’adresse source dans la SOCKADDR structure ou dans rSocketAddress.

int ReceiveFrom(
    void* lpBuf,
    int nBufLen,
    CString& rSocketAddress,
    UINT& rSocketPort,
    int nFlags = 0);

int ReceiveFrom(
    void* lpBuf,
    int nBufLen,
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen,
    int nFlags = 0);

Paramètres

lpBuf
Mémoire tampon pour les données entrantes.

nBufLen
Longueur en lpBuf octets.

rSocketAddress
Référence à un CString objet qui reçoit une adresse IP de nombre en pointillés.

rSocketPort
Référence à un UINT port qui stocke un port.

lpSockAddr
Pointeur vers une SOCKADDR structure qui contient l’adresse source lors du retour.

lpSockAddrLen
Pointeur vers la longueur de l’adresse source en lpSockAddr octets.

nFlags
Spécifie la façon dont l’appel est effectué. La sémantique de cette fonction est déterminée par les options de socket et le nFlags paramètre. Ce dernier est construit en combinant l’une des valeurs suivantes avec l’opérateur OR au niveau du bit C++ (|) :

  • MSG_PEEK Examinez les données entrantes. Les données sont copiées dans la mémoire tampon, mais elles ne sont pas supprimées de la file d’attente d’entrée.

  • MSG_OOB Traitez les données hors bande.

Valeur de retour

Si aucune erreur ne se produit, ReceiveFrom retourne le nombre d’octets reçus. Si la connexion a été fermée, elle retourne 0. Sinon, une valeur est SOCKET_ERROR retournée et un code d’erreur spécifique peut être récupéré en appelant GetLastError. Les erreurs suivantes s’appliquent à cette fonction membre :

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAEFAULT L’argument lpSockAddrLen n’était pas valide : la lpSockAddr mémoire tampon était trop petite pour prendre en charge l’adresse homologue.

  • WSAEINPROGRESS Une opération Windows Sockets bloquante est en cours.

  • WSAEINVAL Le socket n’a pas été lié avec Bind.

  • WSAENOTCONN Le socket n’est pas connecté (SOCK_STREAM uniquement).

  • WSAENOTSOCK Le descripteur n’est pas un socket.

  • WSAEOPNOTSUPPMSG_OOB a été spécifié, mais le socket n’est pas de type SOCK_STREAM.

  • WSAESHUTDOWN Le socket a été arrêté ; il n’est pas possible d’appeler ReceiveFrom un socket après ShutDown avoir été appelé avec nHow la valeur 0 ou 2.

  • WSAEWOULDBLOCK Le socket est marqué comme non bloquant et l’opération ReceiveFrom bloquerait.

  • WSAEMSGSIZE Le datagramme était trop volumineux pour s’adapter à la mémoire tampon spécifiée et a été tronqué.

  • WSAECONNABORTED Le circuit virtuel a été abandonné en raison d’un délai d’expiration ou d’une autre défaillance.

  • WSAECONNRESET Le circuit virtuel a été réinitialisé par le côté distant.

Notes

Cette fonction est utilisée pour lire les données entrantes sur un socket (éventuellement connecté) et capturer l’adresse à partir de laquelle les données ont été envoyées.

Pour gérer les adresses IPv6, utilisez CAsyncSocket::ReceiveFromEx.

Pour les sockets de type SOCK_STREAM, autant d’informations que celles actuellement disponibles jusqu’à la taille de la mémoire tampon fournie est retournée. Si le socket a été configuré pour la réception en ligne des données hors bande (option SO_OOBINLINEde socket) et que les données hors bande ne sont pas lus, seules les données hors bande sont retournées. L’application peut utiliser l’option IOCtlSIOCATMARK ou OnOutOfBandData déterminer si des données hors bande restent à lire. Les lpSockAddr paramètres et lpSockAddrLen les paramètres sont ignorés pour SOCK_STREAM les sockets.

Pour les sockets de datagramme, les données sont extraites du premier datagramme mis en file d’attente, jusqu’à la taille de la mémoire tampon fournie. Si le datagramme est supérieur à la mémoire tampon fournie, la mémoire tampon est remplie avec la première partie du message, les données excédentaires sont perdues et ReceiveFrom retourne une valeur avec SOCKET_ERROR le code d’erreur défini sur WSAEMSGSIZE.

S’il lpSockAddr n’est pas différent de zéro et que le socket est de type SOCK_DGRAM, l’adresse réseau du socket qui a envoyé les données est copiée dans la structure correspondante SOCKADDR . La valeur pointée par lpSockAddrLen est initialisée à la taille de cette structure et est modifiée en retour pour indiquer la taille réelle de l’adresse stockée. Si aucune donnée entrante n’est disponible sur le socket, l’appel ReceiveFrom attend que les données arrivent, sauf si le socket n’est pas bloqué. Dans ce cas, une valeur est SOCKET_ERROR retournée avec le code d’erreur défini sur WSAEWOULDBLOCK. Le OnReceive rappel peut être utilisé pour déterminer quand plus de données arrivent.

Si le socket est de type SOCK_STREAM et que le côté distant a arrêté la connexion correctement, une ReceiveFrom opération se termine immédiatement avec 0 octets reçus.

CAsyncSocket::ReceiveFromEx

Appelez cette fonction membre pour recevoir un datagramme et stocker l’adresse source dans la SOCKADDR structure ou dans rSocketAddress (gère les adresses IPv6).

int ReceiveFromEx(
    void* lpBuf,
    int nBufLen,
    CString& rSocketAddress,
    UINT& rSocketPort,
    int nFlags = 0);

Paramètres

lpBuf
Mémoire tampon pour les données entrantes.

nBufLen
Longueur en lpBuf octets.

rSocketAddress
Référence à un CString objet qui reçoit une adresse IP de nombre en pointillés.

rSocketPort
Référence à un UINT port qui stocke un port.

nFlags
Spécifie la façon dont l’appel est effectué. La sémantique de cette fonction est déterminée par les options de socket et le nFlags paramètre. Ce dernier est construit en combinant l’une des valeurs suivantes avec l’opérateur OR au niveau du bit C++ (|) :

  • MSG_PEEK Examinez les données entrantes. Les données sont copiées dans la mémoire tampon, mais elles ne sont pas supprimées de la file d’attente d’entrée.

  • MSG_OOB Traitez les données hors bande.

Valeur de retour

Si aucune erreur ne se produit, ReceiveFromEx retourne le nombre d’octets reçus. Si la connexion a été fermée, elle retourne 0. Sinon, une valeur est SOCKET_ERROR retournée et un code d’erreur spécifique peut être récupéré en appelant GetLastError. Les erreurs suivantes s’appliquent à cette fonction membre :

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAEFAULT L’argument lpSockAddrLen n’était pas valide : la lpSockAddr mémoire tampon était trop petite pour prendre en charge l’adresse homologue.

  • WSAEINPROGRESS Une opération Windows Sockets bloquante est en cours.

  • WSAEINVAL Le socket n’a pas été lié avec Bind.

  • WSAENOTCONN Le socket n’est pas connecté (SOCK_STREAM uniquement).

  • WSAENOTSOCK Le descripteur n’est pas un socket.

  • WSAEOPNOTSUPPMSG_OOB a été spécifié, mais le socket n’est pas de type SOCK_STREAM.

  • WSAESHUTDOWN Le socket a été arrêté ; il n’est pas possible d’appeler ReceiveFromEx un socket après ShutDown avoir été appelé avec nHow la valeur 0 ou 2.

  • WSAEWOULDBLOCK Le socket est marqué comme non bloquant et l’opération ReceiveFromEx bloquerait.

  • WSAEMSGSIZE Le datagramme était trop volumineux pour s’adapter à la mémoire tampon spécifiée et a été tronqué.

  • WSAECONNABORTED Le circuit virtuel a été abandonné en raison d’un délai d’expiration ou d’une autre défaillance.

  • WSAECONNRESET Le circuit virtuel a été réinitialisé par le côté distant.

Notes

Cette fonction est utilisée pour lire les données entrantes sur un socket (éventuellement connecté) et capturer l’adresse à partir de laquelle les données ont été envoyées.

Cette fonction est la même que CAsyncSocket::ReceiveFrom celle qui gère les adresses IPv6 ainsi que les protocoles plus anciens.

Pour les sockets de type SOCK_STREAM, autant d’informations que celles actuellement disponibles jusqu’à la taille de la mémoire tampon fournie est retournée. Si le socket a été configuré pour la réception en ligne des données hors bande (option SO_OOBINLINEde socket) et que les données hors bande ne sont pas lus, seules les données hors bande sont retournées. L’application peut utiliser l’option IOCtlSIOCATMARK ou OnOutOfBandData déterminer si des données hors bande restent à lire. Les lpSockAddr paramètres et lpSockAddrLen les paramètres sont ignorés pour SOCK_STREAM les sockets.

Pour les sockets de datagramme, les données sont extraites du premier datagramme mis en file d’attente, jusqu’à la taille de la mémoire tampon fournie. Si le datagramme est supérieur à la mémoire tampon fournie, la mémoire tampon est remplie avec la première partie du message, les données excédentaires sont perdues et ReceiveFromEx retourne une valeur avec SOCKET_ERROR le code d’erreur défini sur WSAEMSGSIZE.

S’il lpSockAddr n’est pas différent de zéro et que le socket est de type SOCK_DGRAM, l’adresse réseau du socket qui a envoyé les données est copiée dans la structure correspondante SOCKADDR . La valeur pointée par lpSockAddrLen est initialisée à la taille de cette structure et est modifiée en retour pour indiquer la taille réelle de l’adresse stockée. Si aucune donnée entrante n’est disponible sur le socket, l’appel ReceiveFromEx attend que les données arrivent, sauf si le socket n’est pas bloqué. Dans ce cas, une valeur est SOCKET_ERROR retournée avec le code d’erreur défini sur WSAEWOULDBLOCK. Le OnReceive rappel peut être utilisé pour déterminer quand plus de données arrivent.

Si le socket est de type SOCK_STREAM et que le côté distant a arrêté la connexion correctement, une ReceiveFromEx opération se termine immédiatement avec 0 octets reçus.

CAsyncSocket::Send

Appelez cette fonction membre pour envoyer des données sur un socket connecté.

virtual int Send(
    const void* lpBuf,
    int nBufLen,
    int nFlags = 0);

Paramètres

lpBuf
Mémoire tampon contenant les données à transmettre.

nBufLen
Longueur des données lpBuf en octets.

nFlags
Spécifie la façon dont l’appel est effectué. La sémantique de cette fonction est déterminée par les options de socket et le nFlags paramètre. Ce dernier est construit en combinant l’une des valeurs suivantes avec l’opérateur OR au niveau du bit C++ (|) :

  • MSG_DONTROUTE Spécifie que les données ne doivent pas être soumises au routage. Un fournisseur Windows Sockets peut choisir d’ignorer cet indicateur.

  • MSG_OOB Envoyer des données hors bande (SOCK_STREAM uniquement).

Valeur de retour

Si aucune erreur ne se produit, Send retourne le nombre total de caractères envoyés. (Notez que cela peut être inférieur au nombre indiqué par nBufLen.) Sinon, une valeur est SOCKET_ERROR retournée et un code d’erreur spécifique peut être récupéré en appelant GetLastError. Les erreurs suivantes s’appliquent à cette fonction membre :

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAEACCES L’adresse demandée est une adresse de diffusion, mais l’indicateur approprié n’a pas été défini.

  • WSAEINPROGRESS Une opération Windows Sockets bloquante est en cours.

  • WSAEFAULT L’argument lpBuf n’est pas dans une partie valide de l’espace d’adressage utilisateur.

  • WSAENETRESET La connexion doit être réinitialisée, car l’implémentation de Windows Sockets l’a supprimée.

  • WSAENOBUFS L’implémentation de Windows Sockets signale un blocage de mémoire tampon.

  • WSAENOTCONN Le socket n’est pas connecté.

  • WSAENOTSOCK Le descripteur n’est pas un socket.

  • WSAEOPNOTSUPPMSG_OOB a été spécifié, mais le socket n’est pas de type SOCK_STREAM.

  • WSAESHUTDOWN Le socket a été arrêté ; Il n’est pas possible d’appeler Send un socket après ShutDown avoir été appelé avec nHow la valeur 1 ou 2.

  • WSAEWOULDBLOCK Le socket est marqué comme non bloquant et l’opération demandée bloquerait.

  • WSAEMSGSIZE Le socket est de type SOCK_DGRAMet le datagramme est supérieur au maximum pris en charge par l’implémentation de Sockets Windows.

  • WSAEINVAL Le socket n’a pas été lié avec Bind.

  • WSAECONNABORTED Le circuit virtuel a été abandonné en raison d’un délai d’expiration ou d’une autre défaillance.

  • WSAECONNRESET Le circuit virtuel a été réinitialisé par le côté distant.

Notes

Send est utilisé pour écrire des données sortantes sur des sockets de flux ou de datagramme connectés. Pour les sockets de datagramme, vous devez veiller à ne pas dépasser la taille maximale des paquets IP des sous-réseaux sous-jacents, qui est donné par l’élément iMaxUdpDg de la WSADATA structure retournée par AfxSocketInit. Si les données sont trop longues pour passer atomiquement via le protocole sous-jacent, l’erreur WSAEMSGSIZE est retournée par GetLastErrorle biais et aucune donnée n’est transmise.

Notez que pour un socket de datagramme, la réussite d’un Send socket n’indique pas que les données ont été correctement remises.

Sur CAsyncSocket les objets de type SOCK_STREAM, le nombre d’octets écrits peut être compris entre 1 et la longueur demandée, en fonction de la disponibilité de la mémoire tampon sur les hôtes locaux et étrangers.

Exemple

Consultez l’exemple pour CAsyncSocket::OnSend.

CAsyncSocket::SendTo

Appelez cette fonction membre pour envoyer des données à une destination spécifique.

int SendTo(
    const void* lpBuf,
    int nBufLen,
    UINT nHostPort,
    LPCTSTR lpszHostAddress = NULL,
    int nFlags = 0);

int SendTo(
    const void* lpBuf,
    int nBufLen,
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen,
    int nFlags = 0);

Paramètres

lpBuf
Mémoire tampon contenant les données à transmettre.

nBufLen
Longueur des données lpBuf en octets.

nHostPort
Port identifiant l’application de socket.

lpszHostAddress
Adresse réseau du socket auquel cet objet est connecté : un nom d’ordinateur tel que « ftp.microsoft.com » ou un nombre en pointillés tel que « 128.56.22.8 ».

nFlags
Spécifie la façon dont l’appel est effectué. La sémantique de cette fonction est déterminée par les options de socket et le nFlags paramètre. Ce dernier est construit en combinant l’une des valeurs suivantes avec l’opérateur OR au niveau du bit C++ (|) :

  • MSG_DONTROUTE Spécifie que les données ne doivent pas être soumises au routage. Un fournisseur Windows Sockets peut choisir d’ignorer cet indicateur.

  • MSG_OOB Envoyer des données hors bande (SOCK_STREAM uniquement).

lpSockAddr
Pointeur vers une SOCKADDR structure qui contient l’adresse du socket cible.

nSockAddrLen
Longueur de l’adresse en lpSockAddr octets.

Valeur de retour

Si aucune erreur ne se produit, SendTo retourne le nombre total de caractères envoyés. (Notez que cela peut être inférieur au nombre indiqué par nBufLen.) Sinon, une valeur est SOCKET_ERROR retournée et un code d’erreur spécifique peut être récupéré en appelant GetLastError. Les erreurs suivantes s’appliquent à cette fonction membre :

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAEACCES L’adresse demandée est une adresse de diffusion, mais l’indicateur approprié n’a pas été défini.

  • WSAEINPROGRESS Une opération Windows Sockets bloquante est en cours.

  • WSAEFAULT Le lpBuf ou lpSockAddr les paramètres ne font pas partie de l’espace d’adressage utilisateur, ou l’argument lpSockAddr est trop petit (inférieur à la taille d’une SOCKADDR structure).

  • WSAEINVAL Le nom d’hôte n’est pas valide.

  • WSAENETRESET La connexion doit être réinitialisée, car l’implémentation de Windows Sockets l’a supprimée.

  • WSAENOBUFS L’implémentation de Windows Sockets signale un blocage de mémoire tampon.

  • WSAENOTCONN Le socket n’est pas connecté (SOCK_STREAM uniquement).

  • WSAENOTSOCK Le descripteur n’est pas un socket.

  • WSAEOPNOTSUPPMSG_OOB a été spécifié, mais le socket n’est pas de type SOCK_STREAM.

  • WSAESHUTDOWN Le socket a été arrêté ; Il n’est pas possible d’appeler SendTo un socket après ShutDown avoir été appelé avec nHow la valeur 1 ou 2.

  • WSAEWOULDBLOCK Le socket est marqué comme non bloquant et l’opération demandée bloquerait.

  • WSAEMSGSIZE Le socket est de type SOCK_DGRAMet le datagramme est supérieur au maximum pris en charge par l’implémentation de Sockets Windows.

  • WSAECONNABORTED Le circuit virtuel a été abandonné en raison d’un délai d’expiration ou d’une autre défaillance.

  • WSAECONNRESET Le circuit virtuel a été réinitialisé par le côté distant.

  • WSAEADDRNOTAVAIL L’adresse spécifiée n’est pas disponible à partir de l’ordinateur local.

  • WSAEAFNOSUPPORT Les adresses de la famille spécifiée ne peuvent pas être utilisées avec ce socket.

  • WSAEDESTADDRREQ Une adresse de destination est requise.

  • WSAENETUNREACH Le réseau ne peut pas être atteint à partir de cet hôte pour l’instant.

Notes

SendTo est utilisé sur le datagramme ou les sockets de flux et est utilisé pour écrire des données sortantes sur un socket. Pour les sockets de datagramme, vous devez veiller à ne pas dépasser la taille maximale des paquets IP des sous-réseaux sous-jacents, qui est donné par l’élément iMaxUdpDg de la WSADATA structure renseignée par AfxSocketInit. Si les données sont trop longues pour passer atomiquement via le protocole sous-jacent, l’erreur WSAEMSGSIZE est retournée et aucune donnée n’est transmise.

Notez que la réussite d’une SendTo opération n’indique pas que les données ont été correctement livrées.

SendTo est utilisé uniquement sur un SOCK_DGRAM socket pour envoyer un datagramme à un socket spécifique identifié par le lpSockAddr paramètre.

Pour envoyer une diffusion (sur un SOCK_DGRAM seul), l’adresse du lpSockAddr paramètre doit être construite à l’aide de l’adresse INADDR_BROADCAST IP spéciale (définie dans le fichier WINSOCK.Hd’en-tête Windows Sockets) avec le numéro de port prévu. Ou, si le lpszHostAddress paramètre est NULL, le socket est configuré pour la diffusion. Il est généralement inadvisable pour qu’un datagramme de diffusion dépasse la taille à laquelle la fragmentation peut se produire, ce qui implique que la partie données du datagramme (à l’exclusion des en-têtes) ne doit pas dépasser 512 octets.

Pour gérer les adresses IPv6, utilisez CAsyncSocket::SendToEx.

CAsyncSocket::SendToEx

Appelez cette fonction membre pour envoyer des données à une destination spécifique (gère les adresses IPv6).

int SendToEx(
    const void* lpBuf,
    int nBufLen,
    UINT nHostPort,
    LPCTSTR lpszHostAddress = NULL,
    int nFlags = 0);

Paramètres

lpBuf
Mémoire tampon contenant les données à transmettre.

nBufLen
Longueur des données lpBuf en octets.

nHostPort
Port identifiant l’application de socket.

lpszHostAddress
Adresse réseau du socket auquel cet objet est connecté : un nom d’ordinateur tel que « ftp.microsoft.com » ou un nombre en pointillés tel que « 128.56.22.8 ».

nFlags
Spécifie la façon dont l’appel est effectué. La sémantique de cette fonction est déterminée par les options de socket et le nFlags paramètre. Ce dernier est construit en combinant l’une des valeurs suivantes avec l’opérateur OR au niveau du bit C++ (|) :

  • MSG_DONTROUTE Spécifie que les données ne doivent pas être soumises au routage. Un fournisseur Windows Sockets peut choisir d’ignorer cet indicateur.

  • MSG_OOB Envoyer des données hors bande (SOCK_STREAM uniquement).

Valeur de retour

Si aucune erreur ne se produit, SendToEx retourne le nombre total de caractères envoyés. (Notez que cela peut être inférieur au nombre indiqué par nBufLen.) Sinon, une valeur est SOCKET_ERROR retournée et un code d’erreur spécifique peut être récupéré en appelant GetLastError. Les erreurs suivantes s’appliquent à cette fonction membre :

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAEACCES L’adresse demandée est une adresse de diffusion, mais l’indicateur approprié n’a pas été défini.

  • WSAEINPROGRESS Une opération Windows Sockets bloquante est en cours.

  • WSAEFAULT Le lpBuf ou lpSockAddr les paramètres ne font pas partie de l’espace d’adressage utilisateur, ou l’argument lpSockAddr est trop petit (inférieur à la taille d’une SOCKADDR structure).

  • WSAEINVAL Le nom d’hôte n’est pas valide.

  • WSAENETRESET La connexion doit être réinitialisée, car l’implémentation de Windows Sockets l’a supprimée.

  • WSAENOBUFS L’implémentation de Windows Sockets signale un blocage de mémoire tampon.

  • WSAENOTCONN Le socket n’est pas connecté (SOCK_STREAM uniquement).

  • WSAENOTSOCK Le descripteur n’est pas un socket.

  • WSAEOPNOTSUPPMSG_OOB a été spécifié, mais le socket n’est pas de type SOCK_STREAM.

  • WSAESHUTDOWN Le socket a été arrêté ; Il n’est pas possible d’appeler SendToEx un socket après ShutDown avoir été appelé avec nHow la valeur 1 ou 2.

  • WSAEWOULDBLOCK Le socket est marqué comme non bloquant et l’opération demandée bloquerait.

  • WSAEMSGSIZE Le socket est de type SOCK_DGRAMet le datagramme est supérieur au maximum pris en charge par l’implémentation de Sockets Windows.

  • WSAECONNABORTED Le circuit virtuel a été abandonné en raison d’un délai d’expiration ou d’une autre défaillance.

  • WSAECONNRESET Le circuit virtuel a été réinitialisé par le côté distant.

  • WSAEADDRNOTAVAIL L’adresse spécifiée n’est pas disponible à partir de l’ordinateur local.

  • WSAEAFNOSUPPORT Les adresses de la famille spécifiée ne peuvent pas être utilisées avec ce socket.

  • WSAEDESTADDRREQ Une adresse de destination est requise.

  • WSAENETUNREACH Le réseau ne peut pas être atteint à partir de cet hôte pour l’instant.

Notes

Cette méthode est identique à CAsyncSocket::SendTo celle qu’elle gère les adresses IPv6 ainsi que les protocoles plus anciens.

SendToEx est utilisé sur le datagramme ou les sockets de flux et est utilisé pour écrire des données sortantes sur un socket. Pour les sockets de datagramme, vous devez veiller à ne pas dépasser la taille maximale des paquets IP des sous-réseaux sous-jacents, qui est donné par l’élément iMaxUdpDg de la WSADATA structure renseignée par AfxSocketInit. Si les données sont trop longues pour passer atomiquement via le protocole sous-jacent, l’erreur WSAEMSGSIZE est retournée et aucune donnée n’est transmise.

Notez que la réussite d’une SendToEx opération n’indique pas que les données ont été correctement livrées.

SendToEx est utilisé uniquement sur un SOCK_DGRAM socket pour envoyer un datagramme à un socket spécifique identifié par le lpSockAddr paramètre.

Pour envoyer une diffusion (sur un SOCK_DGRAM seul), l’adresse du lpSockAddr paramètre doit être construite à l’aide de l’adresse INADDR_BROADCAST IP spéciale (définie dans le fichier WINSOCK.Hd’en-tête Windows Sockets) avec le numéro de port prévu. Ou, si le lpszHostAddress paramètre est NULL, le socket est configuré pour la diffusion. Il est généralement inadvisable pour qu’un datagramme de diffusion dépasse la taille à laquelle la fragmentation peut se produire, ce qui implique que la partie données du datagramme (à l’exclusion des en-têtes) ne doit pas dépasser 512 octets.

CAsyncSocket::SetSockOpt

Appelez cette fonction membre pour définir une option de socket.

BOOL SetSockOpt(
    int nOptionName,
    const void* lpOptionValue,
    int nOptionLen,
    int nLevel = SOL_SOCKET);

Paramètres

nOptionName
Option de socket pour laquelle la valeur doit être définie.

lpOptionValue
Pointeur vers la mémoire tampon dans laquelle la valeur de l’option demandée est fournie.

nOptionLen
Taille de la lpOptionValue mémoire tampon en octets.

nLevel
Niveau auquel l’option est définie ; les seuls niveaux pris en charge sont SOL_SOCKET et IPPROTO_TCP.

Valeur de retour

Différent de zéro si la fonction réussit ; sinon, 0 et un code d’erreur spécifique peut être récupéré en appelant GetLastError. Les erreurs suivantes s’appliquent à cette fonction membre :

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAEFAULTlpOptionValue n’est pas dans une partie valide de l’espace d’adressage du processus.

  • WSAEINPROGRESS Une opération Windows Sockets bloquante est en cours.

  • WSAEINVALnLevel n’est pas valide ou les informations contenues lpOptionValue ne sont pas valides.

  • WSAENETRESETConnecter ion a expiré lorsqu’elle SO_KEEPALIVE est définie.

  • WSAENOPROTOOPT L’option est inconnue ou non prise en charge. En particulier, SO_BROADCAST n’est pas pris en charge sur les sockets de type SOCK_STREAM, tandis que SO_DONTLINGER, SO_KEEPALIVE, SO_LINGER, et SO_OOBINLINE ne sont pas pris en charge sur les sockets de type SOCK_DGRAM.

  • WSAENOTCONNConnecter ion a été réinitialisée quand SO_KEEPALIVE elle est définie.

  • WSAENOTSOCK Le descripteur n’est pas un socket.

Notes

SetSockOpt définit la valeur actuelle d’une option de socket associée à un socket de n’importe quel type, dans n’importe quel état. Bien que les options puissent exister à plusieurs niveaux de protocole, cette spécification définit uniquement les options qui existent au niveau supérieur « socket ». Les options affectent les opérations de socket, telles que si les données accélérées sont reçues dans le flux de données normal, si les messages de diffusion peuvent être envoyés sur le socket, etc.

Il existe deux types d’options de socket : les options booléennes qui activent ou désactivent une fonctionnalité ou un comportement, et les options qui nécessitent une valeur entière ou une structure. Pour activer une option booléenne, lpOptionValue pointe vers un entier différent de zéro. Pour désactiver l’option lpOptionValue pointe vers un entier égal à zéro. nOptionLen doit être égal aux sizeof(BOOL) options booléennes. Pour d’autres options, lpOptionValue pointe vers l’entier ou la structure qui contient la valeur souhaitée pour l’option, et nOptionLen correspond à la longueur de l’entier ou de la structure.

SO_LINGER contrôle l’action effectuée lorsque des données non liées sont mises en file d’attente sur un socket et que la Close fonction est appelée pour fermer le socket.

Par défaut, un socket ne peut pas être lié (voir Bind) à une adresse locale déjà utilisée. Toutefois, à l’occasion, il peut être souhaitable de « réutiliser » une adresse de cette façon. Étant donné que chaque connexion est identifiée de manière unique par la combinaison d’adresses locales et distantes, il n’existe aucun problème avec le fait d’avoir deux sockets liés à la même adresse locale tant que les adresses distantes sont différentes.

Pour informer l’implémentation des sockets Windows qu’un Bind appel sur un socket ne doit pas être interdit, car l’adresse souhaitée est déjà utilisée par un autre socket, l’application doit définir l’option SO_REUSEADDR de socket pour le socket avant d’émettre l’appel Bind . Notez que l’option est interprétée uniquement au moment de l’appel Bind : il est donc inutile (mais inoffensif) de définir l’option sur un socket qui ne doit pas être liée à une adresse existante, et définir ou réinitialiser l’option après que l’appel Bind n’a aucun effet sur ce socket ou tout autre socket.

Une application peut demander que l’implémentation des sockets Windows active l’utilisation de paquets « keep-alive » sur les connexions TCP (Transmission Control Protocol) en activant l’option SO_KEEPALIVE de socket. Une implémentation de Sockets Windows n’a pas besoin de prendre en charge l’utilisation de keep-alives : si c’est le cas, la sémantique précise est spécifique à l’implémentation, mais doit être conforme à la section 4.2.3.6 de la norme RFC 1122 : « Conditions requises pour les hôtes Internet — Couches de communication ». Si une connexion est supprimée suite à « keep-alives », le code WSAENETRESET d’erreur est retourné à tous les appels en cours sur le socket, et les appels suivants échouent avec WSAENOTCONN.

L’option TCP_NODELAY désactive l’algorithme Nagle. L’algorithme Nagle est utilisé pour réduire le nombre de petits paquets envoyés par un hôte en mettant en mémoire tampon les données d’envoi non reconnues jusqu’à ce qu’un paquet de taille totale puisse être envoyé. Toutefois, pour certaines applications, cet algorithme peut entraver les performances et TCP_NODELAY peut être utilisé pour le désactiver. Les enregistreurs d’applications ne doivent pas définir TCP_NODELAY , sauf si l’impact de cette opération est bien compris et souhaité, car le paramètre TCP_NODELAY peut avoir un impact négatif significatif sur les performances du réseau. TCP_NODELAY est la seule option de socket prise en charge qui utilise le niveau IPPROTO_TCP; toutes les autres options utilisent le niveau SOL_SOCKET.

Certaines implémentations de Windows Sockets fournissent des informations de débogage de sortie si l’option SO_DEBUG est définie par une application.

Les options suivantes sont prises en charge pour SetSockOpt. Le type identifie le type de données traitées par lpOptionValue.

Valeur Type Signification
SO_BROADCAST BOOL Autoriser la transmission de messages de diffusion sur le socket.
SO_DEBUG BOOL Enregistrer les informations de débogage.
SO_DONTLINGER BOOL Ne bloquez Close pas l’attente d’envoi de données non envoyées. La définition de cette option équivaut à définir SO_LINGER avec l_onoff la valeur zéro.
SO_DONTROUTE BOOL Ne routez pas : envoyez directement à l’interface.
SO_KEEPALIVE BOOL Envoyer des keep-alives.
SO_LINGER struct LINGER S’il Close n’y a pas de données non persistantes.
SO_OOBINLINE BOOL Recevoir des données hors bande dans le flux de données normal.
SO_RCVBUF int Spécifiez la taille de la mémoire tampon pour les réceptions.
SO_REUSEADDR BOOL Autorisez le socket à être lié à une adresse déjà utilisée. (Voir Bind.)
SO_SNDBUF int Spécifiez la taille de la mémoire tampon pour les envois.
TCP_NODELAY BOOL Désactive l'algorithme Nagle pour la fusion des envois.

Les options BSD (Berkeley Software Distribution) non prises en charge sont SetSockOpt les suivantes :

Valeur Type Signification
SO_ACCEPTCONN BOOL Le socket écoute
SO_ERROR int Obtenir l’état de l’erreur et effacer.
SO_RCVLOWAT int Recevoir une marque d’eau faible.
SO_RCVTIMEO int Délai d’expiration de réception
SO_SNDLOWAT int Envoyez une marque d’eau faible.
SO_SNDTIMEO int Délai d’attente d’envoi.
SO_TYPE int Type du socket.
IP_OPTIONS Définissez le champ Options dans l’en-tête IP.

CAsyncSocket::ShutDown

Appelez cette fonction membre pour désactiver les envois, les réceptions ou les deux sur le socket.

BOOL ShutDown(int nHow = sends);

Paramètres

nHow
Indicateur qui décrit les types d’opération qui ne seront plus autorisés, à l’aide des valeurs énumérées suivantes :

  • receives = 0

  • envois = 1

  • deux = 2

Valeur de retour

Différent de zéro si la fonction réussit ; sinon, 0 et un code d’erreur spécifique peut être récupéré en appelant GetLastError. Les erreurs suivantes s’appliquent à cette fonction membre :

  • WSANOTINITIALISED Une réussite AfxSocketInit doit se produire avant d’utiliser cette API.

  • WSAENETDOWN L’implémentation de Windows Sockets a détecté que le sous-système réseau a échoué.

  • WSAEINVALnHow n'est pas valide.

  • WSAEINPROGRESS Une opération Windows Sockets bloquante est en cours.

  • WSAENOTCONN Le socket n’est pas connecté (SOCK_STREAM uniquement).

  • WSAENOTSOCK Le descripteur n’est pas un socket.

Notes

ShutDown est utilisé sur tous les types de sockets pour désactiver la réception, la transmission ou les deux. Si nHow la valeur est 0, les réceptions suivantes sur le socket ne sont pas autorisées. Cela n’a aucun effet sur les couches de protocole inférieures.

Pour le protocole TCP (Transmission Control Protocol), la fenêtre TCP n’est pas modifiée et les données entrantes sont acceptées (mais non reconnues) tant que la fenêtre n’est pas épuisée. Pour le protocole UDP (User Datagram Protocol), les datagrammes entrants sont acceptés et mis en file d’attente. Dans aucun cas, un paquet d’erreur ICMP n’est généré. Si nHow la valeur est 1, les envois suivants sont interdits. Pour les sockets TCP, une fin sera envoyée. La valeur nHow 2 désactive les envois et les réceptions comme décrit ci-dessus.

Notez que ne ferme pas le socket et que ShutDown les ressources attachées au socket ne seront pas libérées tant qu’elles Close ne seront pas appelées. Une application ne doit pas s’appuyer sur la possibilité de réutiliser un socket une fois qu’elle a été arrêtée. En particulier, une implémentation de Sockets Windows n’est pas nécessaire pour prendre en charge l’utilisation d’un Connect tel socket.

Exemple

Consultez l’exemple pour CAsyncSocket::OnReceive.

CASyncSocket::Socket

Alloue un handle de socket.

BOOL Socket(
    int nSocketType = SOCK_STREAM,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
    int nProtocolType = 0,
    int nAddressFormat = PF_INET);

Paramètres

nSocketType
Spécifie SOCK_STREAM ou SOCK_DGRAM.

lEvent
Masque de bits qui spécifie une combinaison d’événements réseau dans lesquels l’application est intéressée.

  • FD_READ: Souhaitez recevoir une notification de préparation à la lecture.

  • FD_WRITE: Souhaitez recevoir une notification de préparation à l’écriture.

  • FD_OOB: Souhaitez recevoir une notification de l’arrivée des données hors bande.

  • FD_ACCEPT: Souhaitez recevoir la notification des connexions entrantes.

  • FD_CONNECT: Souhaitez recevoir une notification de connexion terminée.

  • FD_CLOSE: Vous souhaitez recevoir une notification de fermeture de socket.

nProtocolType
Protocole à utiliser avec le socket spécifique à la famille d’adresses indiquée.

nAddressFormat
Spécification de la famille d’adresses.

Valeur de retour

Retourne TRUE en cas de réussite, FALSE en cas d’échec.

Notes

Cette méthode alloue un handle de socket. Il n’appelle CAsyncSocket::Bind pas pour lier le socket à une adresse spécifiée. Vous devez donc appeler Bind ultérieurement pour lier le socket à une adresse spécifiée. Vous pouvez utiliser CAsyncSocket::SetSockOpt pour définir l’option de socket avant sa liaison.

Voir aussi

CObject Classe
Graphique hiérarchique
CSocket Classe
CSocketFile Classe