CAsyncSocket::ReceiveFrom
Appelez la fonction membre pour recevoir un datagramme et enregistrer l'adresse source dans la structure de SOCKADDR 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
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.lpSockAddr
Un pointeur vers une structure de SOCKADDR qui contient l'adresse source lors de le retour.lpSockAddrLen
Un pointeur à la longueur de l'adresse source dans lpSockAddr en octets.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, ReceiveFrom 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 ReceiveFrom 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' ReceiveFrom 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.
Pour gérer des adresses de IPv6, utilisez CAsyncSocket::ReceiveFromEx.
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 ReceiveFrom 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' ReceiveFrom 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, ReceiveFrom se terminera immédiatement les octets 0 acceptés.
Configuration requise
Header: afxsock.h