Condividi tramite


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

Vedere anche

Riferimenti

Classe di CAsyncSocket

Grafico della gerarchia

CAsyncSocket::AsyncSelect

CAsyncSocket::Create

CAsyncSocket::Receive

CAsyncSocket::Send