Partager via


CAsyncSocket::ReceiveFromEx

Appelez la fonction membre pour recevoir un datagramme et enregistrer l'adresse source dans la structure de SOCKADDR ou dans rSocketAddress (adresses de IPv6 de handles).

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

Paramètres

  • lpBuf
    Une mémoire tampon pour les données entrantes.

  • nBufLen
    La longueur d' lpBuf en octets.

  • rSocketAddress
    Référence à un objet d' CString qui accepte une adresse IP du nombre de valeurs séparées par des points.

  • rSocketPort
    Référence à uint qui enregistre un port.

  • nFlags
    Spécifie la façon dont l'appel est passé. La sémantique de cette fonction sont déterminées par les options de socket et le paramètre d' nFlags . Ce dernier est construit en combinant l'un des valeurs avec l'opérateur C++ OR :

    • Coup d'œil deMSG_PEEK sur les données entrantes. Les données sont copiées dans la mémoire tampon mais ne sont pas supprimées de la file d'attente d'entrée.

    • Données hors bande de processus deMSG_OOB .

Valeur de retour

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

  • WSANOTINITIALISED A réussi AfxSocketInit doit se produire avant d'utiliser cette API.

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

  • WSAEFAULT l'argument d' lpSockAddrLen était non valide : la mémoire tampon d' lpSockAddr était trop petite pour s'adapter à l'adresse homologue.

  • WSAEINPROGRESS se bloque l'exécution de Windows Sockets est en cours.

  • WSAEINVAL le socket n'a pas été lié avec Liaison.

  • WSAENOTCONN le socket n'est pas connecté (SOCK_STREAM uniquement).

  • WSAENOTSOCK le modèle n'est pas un socket.

  • WSAEOPNOTSUPP   MSG_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 sur un socket après ShutDown a été appelé avec nHow affectez la valeur 0 ou 2.

  • WSAEWOULDBLOCK le socket est marqué comme non bloquant et l'exécution d' ReceiveFromEx se bloquerait.

  • WSAEMSGSIZE Le datagramme est trop grand pour s'insérer dans la mémoire tampon spécifiée et a été tronqué.

  • LeWSAECONNABORTED VC a été suspendu en raison de délai d'attente ou autre échec.

  • LeWSAECONNRESET VC a été réinitialisé par la partie distant.

Notes

Cette fonction est utilisée pour lire les données entrantes du socket (éventuellement connecté) et pour capturer l'adresse dont les données ont été envoyées.

Cette fonction est identique à CAsyncSocket::ReceiveFrom sauf qu'il gère des adresses de IPv6 ainsi que des protocoles plus anciens.

Pour les sockets de type SOCK_STREAM, autant d'informations que est disponible jusqu'à la taille de la mémoire tampon fournie sont retournées. Si le socket a été configuré pour la réception intégrée des données hors bande option de socket SO_OOBINLINE) et les données hors bande sont non lues, seuls les données hors bande seront retournées. l'application peut utiliser l'option ou OnOutOfBandData d' IOCtlSIOCATMARK de déterminer si plus de données hors bande restent à lire. Les paramètres d' lpSockAddr et d' lpSockAddrLen sont ignorés pour les sockets de SOCK_STREAM .

Pour les sockets 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 plus grande que 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 retourne ReceiveFromEx d'une valeur de SOCKET_ERROR avec un code d'erreur défini à WSAEMSGSIZE.

Si lpSockAddr est différent de zéro, et le socket est de type SOCK_DGRAM, l'adresse du réseau socket qui a envoyé les données est copié dans la structure correspondante de SOCKADDR . La valeur pointée pointe vers lpSockAddrLen est initialisée à la taille de cette structure, et est modifiée au retour pour indiquer la grandeur réelle de l'adresse stockée à cet endroit. Si aucune donnée entrante n'est disponible au socket, l'appel d' ReceiveFromEx attend des données pour arriver à moins que le socket soit non bloquant. Dans ce cas, une valeur de SOCKET_ERROR est retournée avec un code d'erreur défini à WSAEWOULDBLOCK. Le rappel d' OnReceive peut être utilisée pour déterminer si plus de données arrivent.

Si le socket est de type SOCK_STREAM et la partie distant a arrêté la connexion correctement, ReceiveFromEx se terminera immédiatement les octets 0 acceptés.

Configuration requise

Header: afxsock.h

Voir aussi

Référence

CAsyncSocket, classe

Graphique de la hiérarchie

CAsyncSocket::AsyncSelect

CAsyncSocket::Create

CAsyncSocket::Receive

CAsyncSocket::Send