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 (MBCS). 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 : Utilisation CAsyncSocket
de classes et d’articles connexes, ainsi que l’API Windows Sockets 2.
Hiérarchie d'héritage
CAsyncSocket
Spécifications
En-tête : afxsock.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, NULL
aucune 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éussiteAfxSocketInit
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’argumentlpSockAddrLen
est trop petit (inférieur à la taille d’uneSOCKADDR
structure).WSAEINPROGRESS
Un appel Windows Sockets bloquant est en cours.WSAEINVAL
Listen
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éussiteAfxSocketInit
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éussiteAfxSocketInit
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’optionSO_REUSEADDR
socket sousSetSockOpt
.)WSAEFAULT
L’argumentnSockAddrLen
est trop petit (inférieur à la taille d’uneSOCKADDR
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 ignorées. 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 GetSockOpt
membre .
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 WSAEWOULDBLOCK
que 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éussiteAfxSocketInit
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’argumentnSockAddrLen
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éussiteAfxSocketInit
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 videCSocket
comme paramètre. Vous devez construire cet objet avant d’appelerAccept
. N’oubliez pas que si cet objet socket sort de l’étendue, la connexion se ferme. N’appelezCreate
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éussiteAfxSocketInit
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’argumentlpSockAddrLen
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éussiteAfxSocketInit
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’argumentlpSockAddrLen
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éussiteAfxSocketInit
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’argumentlpSockAddrLen
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 avecBind
.
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éussiteAfxSocketInit
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’argumentlpSockAddrLen
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 avecBind
.
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éussiteAfxSocketInit
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’argumentlpOptionLen
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 typeSOCK_STREAM
, tandis queSO_ACCEPTCONN
,SO_DONTLINGER
,SO_KEEPALIVE
,SO_LINGER
etSO_OOBINLINE
ne sont pas pris en charge sur les sockets de typeSOCK_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 WSAENOPROTOOPT
GetLastError
.
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éussiteAfxSocketInit
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
lCommand
n’est pas une commande valide oulpArgument
n’est pas un paramètre acceptable pourlCommand
, 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. LelpArgument
paramètre pointe à unDWORD
point différent de zéro si le mode non bloquant doit être activé et zéro s’il doit être désactivé. SiAsyncSelect
elle a été émise sur un socket, toute tentative d’utilisationIOCtl
pour définir le socket sur le mode de blocage échoue avecWSAEINVAL
. Pour réactiver le socket en mode bloquant et empêcher l’erreurWSAEINVAL
, une application doit d’abord la désactiverAsyncSelect
en appelantAsyncSelect
avec lelEvent
paramètre égal à 0, puis appelerIOCtl
.FIONREAD
Déterminez le nombre maximal d’octets pouvant être lus avec unReceive
appel à partir de ce socket. LelpArgument
paramètre pointe vers unDWORD
point dans lequelIOCtl
stocke le résultat. Si ce socket est de typeSOCK_STREAM
,FIONREAD
retourne la quantité totale de données qui peuvent être lues dans un seulReceive
; cela est normalement identique à la quantité totale de données mises en file d’attente sur le socket. Si ce socket est de typeSOCK_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 typeSOCK_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 suivanteReceive
ouReceiveFrom
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érationSIOCATMARK
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’unReceive
ouReceiveFrom
ne mélange jamais les données hors bande et normales dans le même appel.) LelpArgument
paramètre pointe vers unDWORD
point dans lequelIOCtl
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éussiteAfxSocketInit
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érationListen
.
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’argumentlpSockAddrLen
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 Connect
simplement , 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éussiteAfxSocketInit
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.WSAEOPNOTSUPP
MSG_OOB
a été spécifié, mais le socket n’est pas de typeSOCK_STREAM
.WSAESHUTDOWN
Le socket a été arrêté ; il n’est pas possible d’appelerReceive
un socket aprèsShutDown
avoir été appelé avecnHow
la valeur 0 ou 2.WSAEWOULDBLOCK
Le socket est marqué comme non bloquant et l’opérationReceive
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é avecBind
.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_OOBINLINE
de 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éussiteAfxSocketInit
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’argumentlpSockAddrLen
n’était pas valide : lalpSockAddr
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é avecBind
.WSAENOTCONN
Le socket n’est pas connecté (SOCK_STREAM
uniquement).WSAENOTSOCK
Le descripteur n’est pas un socket.WSAEOPNOTSUPP
MSG_OOB
a été spécifié, mais le socket n’est pas de typeSOCK_STREAM
.WSAESHUTDOWN
Le socket a été arrêté ; il n’est pas possible d’appelerReceiveFrom
un socket aprèsShutDown
avoir été appelé avecnHow
la valeur 0 ou 2.WSAEWOULDBLOCK
Le socket est marqué comme non bloquant et l’opérationReceiveFrom
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_OOBINLINE
de 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éussiteAfxSocketInit
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’argumentlpSockAddrLen
n’était pas valide : lalpSockAddr
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é avecBind
.WSAENOTCONN
Le socket n’est pas connecté (SOCK_STREAM
uniquement).WSAENOTSOCK
Le descripteur n’est pas un socket.WSAEOPNOTSUPP
MSG_OOB
a été spécifié, mais le socket n’est pas de typeSOCK_STREAM
.WSAESHUTDOWN
Le socket a été arrêté ; il n’est pas possible d’appelerReceiveFromEx
un socket aprèsShutDown
avoir été appelé avecnHow
la valeur 0 ou 2.WSAEWOULDBLOCK
Le socket est marqué comme non bloquant et l’opérationReceiveFromEx
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_OOBINLINE
de 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éussiteAfxSocketInit
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’argumentlpBuf
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.WSAEOPNOTSUPP
MSG_OOB
a été spécifié, mais le socket n’est pas de typeSOCK_STREAM
.WSAESHUTDOWN
Le socket a été arrêté ; Il n’est pas possible d’appelerSend
un socket aprèsShutDown
avoir été appelé avecnHow
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 typeSOCK_DGRAM
et 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é avecBind
.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 GetLastError
le 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éussiteAfxSocketInit
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
LelpBuf
oulpSockAddr
les paramètres ne font pas partie de l’espace d’adressage utilisateur, ou l’argumentlpSockAddr
est trop petit (inférieur à la taille d’uneSOCKADDR
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.WSAEOPNOTSUPP
MSG_OOB
a été spécifié, mais le socket n’est pas de typeSOCK_STREAM
.WSAESHUTDOWN
Le socket a été arrêté ; Il n’est pas possible d’appelerSendTo
un socket aprèsShutDown
avoir été appelé avecnHow
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 typeSOCK_DGRAM
et 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.H
d’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éussiteAfxSocketInit
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
LelpBuf
oulpSockAddr
les paramètres ne font pas partie de l’espace d’adressage utilisateur, ou l’argumentlpSockAddr
est trop petit (inférieur à la taille d’uneSOCKADDR
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.WSAEOPNOTSUPP
MSG_OOB
a été spécifié, mais le socket n’est pas de typeSOCK_STREAM
.WSAESHUTDOWN
Le socket a été arrêté ; Il n’est pas possible d’appelerSendToEx
un socket aprèsShutDown
avoir été appelé avecnHow
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 typeSOCK_DGRAM
et 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.H
d’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éussiteAfxSocketInit
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
lpOptionValue
n’est pas dans une partie valide de l’espace d’adressage du processus.WSAEINPROGRESS
Une opération Windows Sockets bloquante est en cours.WSAEINVAL
nLevel
n’est pas valide ou les informations contenueslpOptionValue
ne sont pas valides.WSAENETRESET
La connexion a expiré quandSO_KEEPALIVE
elle 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 typeSOCK_STREAM
, tandis queSO_DONTLINGER
,SO_KEEPALIVE
,SO_LINGER
, etSO_OOBINLINE
ne sont pas pris en charge sur les sockets de typeSOCK_DGRAM
.WSAENOTCONN
La connexion a été réinitialisée quandSO_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éussiteAfxSocketInit
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
nHow
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