Condividi tramite


Classe di CSocket

Deriva da CAsyncSocket, eredita il relativo incapsulamento di Windows Sockets API e rappresenta un livello più elevato di astrazione che quello di un oggetto CAsyncSocket.

class CSocket : public CAsyncSocket

Membri

wxzt95kb.collapse_all(it-it,VS.110).gifCostruttori pubblici

Nome

Descrizione

CSocket::CSocket

Costruisce un oggetto CSocket.

wxzt95kb.collapse_all(it-it,VS.110).gifMetodi pubblici

Nome

Descrizione

CSocket::Attach

Associa gli handle SOCKET a un oggetto CSocket.

CSocket::CancelBlockingCall

Annulla una chiamata di blocco che è in corso.

CSocket::Create

Crea un socket.

CSocket::FromHandle

Restituisce un puntatore a un oggetto CSocket, dato un handle SOCKET.

CSocket::IsBlocking

Determina se una chiamata di blocco è in corso.

wxzt95kb.collapse_all(it-it,VS.110).gifMetodi protetti

Nome

Descrizione

CSocket::OnMessagePending

Chiamato per elaborare in attesa dei messaggi mentre attesa di una chiamata di blocco per completare.

Note

Funzionamento diCSocket con le classi CSocketFile e CArchive per gestire l'invio e la ricezione di dati.

Un oggetto CSocket fornisce anche il blocco, che è essenziale all'operazione sincrona CArchive.Il blocco viene eseguito, come Receive, Send, ReceiveFrom, SendToe Accept (interamente ereditato da CAsyncSocket), non restituisce un errore WSAEWOULDBLOCK in CSocket.Invece, queste funzioni attende fino al completamento di quest'ultima.Inoltre, la chiamata originale termina con l'errore WSAEINTR se CancelBlockingCall viene chiamato quando una di queste funzioni è bloccato.

Per utilizzare un oggetto CSocket, chiamare il costruttore, la chiamata Create per creare un handle sottostante SOCKET (tipo SOCKET).I parametri predefiniti Create creano un socket di flusso, ma se non si utilizza un socket a un oggetto CArchive, è possibile specificare un parametro per creare un socket di datagramma invece, o associare a una porta specifica per creare un socket del server.Connettersi a un socket client utilizzando Connect lato client e Accept lato server.Creare quindi un oggetto CSocketFile un oggetto e associarlo all'oggetto CSocket nel costruttore CSocketFile.Successivamente, creare un oggetto CArchive per l'invio e uno per ricevere dati (se necessario), quindi associli con l'oggetto CSocketFile nel costruttore CArchive.Quando le comunicazioni completate, eliminare CArchive, CSocketFilee gli oggetti CSocket.Il tipo di dati SOCKET è descritto nell'articolo Windows Sockets: sfondo.

Quando si utilizza CArchive con CSocketFile e CSocket, potrebbe verificarsi una situazione in cui CSocket::Receive immette un ciclo (da PumpMessages(FD_READ)) che attende la quantità richiesta di byte.Questo perché i socket di Windows consente solo una chiamata di recv per notifica di FD_READ, ma CSocketFile e CSocket consentono più chiamate di recv per FD_READ.Se viene visualizzato un FD_READ quando non vi sono dati da leggere, verrà bloccato.Se non si ottengono mai un altro FD_READ, l'applicazione termina la sessione di per comunicare su socket.

È possibile risolvere questo problema come segue.Nel metodo OnReceive della classe di socket, chiamata CAsyncSocket::IOCtl(FIONREAD, ...) prima di chiamare il metodo Serialize della classe di messaggio quando i dati previsti da leggere da socket supera la dimensione di un pacchetto TCP (Maximum Transmission Unit il supporto della rete, in genere di almeno 1096 byte).Se la dimensione dei dati disponibili meno di quanto necessario, aspetti tutti i dati da ricevere solo e quindi avviare l'operazione di lettura.

Nell'esempio seguente, m_dwExpected è il numero di byte approssimativo che l'utente prevede di ricevere.Si presuppone che lo dichiara altrove nel codice.

void CChatSocket::OnReceive(int nErrorCode)
{
   CSocket::OnReceive(nErrorCode);

   DWORD dwReceived;

   if (IOCtl(FIONREAD, &dwReceived))
   {
      if (dwReceived >= m_dwExpected)   // Process only if you have enough data
         m_pDoc->ProcessPendingRead();
   }
   else
   {
      // Error handling here
   }
}

[!NOTA]

In utilizzare sockets MFC nei thread secondari in un'applicazione collegata in modo statico MFC, è necessario chiamare AfxSocketInit in ogni thread che utilizza i socket per inizializzare le librerie di socket.Per impostazione predefinita, AfxSocketInit viene chiamato solo nel thread primario.

Per ulteriori informazioni, vedere In Windows Sockets MFC, Windows Sockets: Utilizzo di socket con gli archivi, Windows Sockets: Come socket con il lavoro degli archivi, Windows Sockets: sequenza di operazioni, Windows Sockets: Esempio di socket utilizzando gli archivi.

Gerarchia di ereditarietà

CObject

CAsyncSocket

CSocket

Requisiti

intestazione: afxsock.h

Vedere anche

Riferimenti

Classe di CAsyncSocket

Grafico della gerarchia

Classe di CAsyncSocket

Classe di CSocketFile