CAsyncSocket::ReceiveFrom
Chiamare la funzione membro per ricevere un datagram e archiviare l'indirizzo di destinazione nella struttura SOCKADDR o in 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
);
Parametri
lpBuf
Un buffer dei dati in ingresso.nBufLen
La lunghezza lpBuf in byte.rSocketAddress
Riferimento a un oggetto CString che riceve un indirizzo IP tratteggiato del numero.rSocketPort
Riferimento a uint che archivia una porta.lpSockAddr
Un puntatore a una struttura SOCKADDR che utilizza l'indirizzo di destinazione da restituire.lpSockAddrLen
Un puntatore alla lunghezza dell'indirizzo di destinazione in lpSockAddr in byte.nFlags
Specifica la modalità in cui la chiamata viene eseguita.La semantica di questa funzione viene determinata dalle opzioni di socket e dal parametro nFlags.L'ultimo viene costruito combinando uno dei seguenti valori con l'operatore C++ OR :Sbirciata diMSG_PEEK ai dati in ingresso.I dati vengono copiati nel buffer ma non vengono rimossi dalla coda di input.
Dati fuori banda di processo diMSG_OOB.
Valore restituito
Se non si verificano errori, ReceiveFrom restituisce il numero di byte ricevuti.Se la connessione è stata chiusa, restituisce 0.In caso contrario, un valore SOCKET_ERROR viene restituito e un codice di errore specifico può essere recuperato chiamando GetLastError.Gli errori seguenti si applicano a questa funzione membro:
WSANOTINITIALISED Al AfxSocketInit deve verificarsi prima di utilizzare questa API.
WSAENETDOWN che l'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscita.
WSAEFAULT l'argomento lpSockAddrLen non è valido: il buffer lpSockAddr è troppo piccolo per includere l'indirizzo peer.
WSAEINPROGRESS che blocca l'operazione di Windows Sockets è in corso.
IlWSAEINVAL socket non è stato associato a Associa.
IlWSAENOTCONN socket non è connessoSOCK_STREAM (solo).
WSAENOTSOCK il descrittore non è un socket.
WSAEOPNOTSUPP MSG_OOB è stato specificato, ma il socket non è di tipo SOCK_STREAM.
IlWSAESHUTDOWN socket è stato interrotto; non è possibile chiamare ReceiveFrom su un socket dopo ShutDown è stato richiamato con nHow impostato su 0 o 2.
IlWSAEWOULDBLOCK socket è contrassegnato come non bloccante e l'operazione ReceiveFrom blocca.
IlWSAEMSGSIZE datagram è troppo grande per inserire nel buffer specificato ed è stato troncato.
IlWSAECONNABORTED circuito virtuale è stato interrotto a causa dell'intervallo o di altro tipo.
IlWSAECONNRESET circuito virtuale è stato reimpostato sul lato remoto.
Note
Questa funzione viene utilizzata per leggere i dati in ingresso su socket (eventualmente connessa) e per acquisire l'indirizzo che i dati inviati.
Per gestire gli indirizzi IPv6, utilizzare CAsyncSocket::ReceiveFromEx.
Per i socket di tipo SOCK_STREAM, tutte le informazioni che sono attualmente disponibili finché la dimensione del buffer fornito vengono restituite.Se il socket è stato configurato per ricevere inline di dati fuori banda (opzione di socket SO_OOBINLINE) e i dati fuori banda non vengono letti, solo i dati fuori banda verranno restituiti.L'applicazione può utilizzare l'opzione o OnOutOfBandDataIOCtlSIOCATMARK determinare se altri dati fuori banda da leggere.I parametri lpSockAddrLen e lpSockAddr vengono ignorati per i socket SOCK_STREAM.
Per i socket di datagramma, i dati vengono estratti dal primo datagram enqueued, fino alla dimensione del buffer specificato.Se il datagram è più grande del buffer fornito, il buffer viene inserito prima parte del messaggio, i dati in eccesso vengono persi e ritorno ReceiveFrom un valore SOCKET_ERROR con il codice di errore impostato su WSAEMSGSIZE.
Se lpSockAddr è diverso da zero e il socket è di tipo SOCK_DGRAM, l'indirizzo di rete di socket che ha inviato i dati viene copiato nella struttura corrispondente SOCKADDR.Il valore puntato da lpSockAddrLen viene inizializzato alla dimensione della struttura e viene modificato da restituire per indicare la dimensione effettiva dell'indirizzo archiviato in.Se non sono disponibili dati in ingresso disponibili a socket, attende di chiamata ReceiveFrom i dati da arrivare a meno che il sia socket non bloccante.In questo caso, un valore SOCKET_ERROR viene restituito dal codice di errore impostato su WSAEWOULDBLOCK.Il callback OnReceive può essere utilizzato per determinare quando più dati arrivano.
Se il socket è di tipo SOCK_STREAM e il lato remoto chiude la connessione correttamente, ReceiveFrom completata immediatamente ai 0 byte ricevuti.
Requisiti
Header: afxsock.h