Condividi tramite


Classe CSocket

Deriva da CAsyncSocket, eredita l'incapsulamento dell'API Windows Sockets e rappresenta un livello di astrazione superiore a quello di un CAsyncSocket oggetto .

Sintassi

class CSocket : public CAsyncSocket

Membri

Costruttori pubblici

Nome Descrizione
CSocket::CSocket Costruisce un oggetto CSocket.

Metodi pubblici

Nome Descrizione
CSocket::Attach Collega un SOCKET handle a un CSocket oggetto .
CSocket::CancelBlockingCall Annulla una chiamata di blocco attualmente in corso.
CSocket::Create Crea un socket.
CSocket::FromHandle Restituisce un puntatore a un CSocket oggetto, dato un SOCKET handle.
CSocket::IsBlocking Determina se è in corso una chiamata di blocco.

Metodi protetti

Nome Descrizione
CSocket::OnMessagePending Chiamato per elaborare i messaggi in sospeso durante l'attesa del completamento di una chiamata di blocco.

Osservazioni:

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

Un CSocket oggetto fornisce anche il blocco, essenziale per l'operazione sincrona di CArchive. Le funzioni di blocco, ad esempio Receive, ReceiveFromSend, SendTo, e Accept (tutte ereditate da CAsyncSocket), non restituiscono un WSAEWOULDBLOCK errore in CSocket. Queste funzioni attendono invece il completamento dell'operazione. Inoltre, la chiamata originale terminerà con l'errore WSAEINTR se viene chiamato mentre CancelBlockingCall una di queste funzioni sta bloccando.

Per usare un CSocket oggetto, chiamare il costruttore e quindi chiamare Create per creare l'handle sottostante SOCKET (tipo SOCKET). I parametri predefiniti di creare un socket di Create flusso, ma se non si usa il socket con un CArchive oggetto , è possibile specificare un parametro per creare invece un socket di datagrammi o associarlo a una porta specifica per creare un socket del server. Connettersi a un socket client usando Connect sul lato client e Accept sul lato server. Creare quindi un CSocketFile oggetto e associarlo all'oggetto CSocket nel CSocketFile costruttore. Creare quindi un CArchive oggetto per l'invio e uno per la ricezione di dati (in base alle esigenze), quindi associarli all'oggetto CSocketFile nel CArchive costruttore. Al termine delle comunicazioni, eliminare gli CArchiveoggetti , CSocketFilee CSocket . Il SOCKET tipo di dati è descritto nell'articolo Windows Sockets: Background.

Quando si usa CArchive con CSocketFile e CSocket, è possibile che si verifichi una situazione in cui CSocket::Receive entra in un ciclo (by PumpMessages(FD_READ)) in attesa della quantità richiesta di byte. Ciò è dovuto al fatto che i socket di Windows consentono una sola chiamata recv per FD_READ notifica, ma CSocketFile consentono CSocket più chiamate recv per FD_READ. Se si ottiene un quando FD_READ non sono presenti dati da leggere, l'applicazione si blocca. Se non si ottiene mai un altro FD_READoggetto , l'applicazione smette di comunicare tramite il socket.

È possibile risolvere questo problema come indicato di seguito. OnReceive Nel metodo della classe socket chiamare CAsyncSocket::IOCtl(FIONREAD, ...) prima di chiamare il Serialize metodo della classe messaggio quando i dati previsti da leggere dal socket superano le dimensioni di un pacchetto TCP (unità di trasmissione massima del supporto di rete, in genere almeno 1096 byte). Se le dimensioni dei dati disponibili sono inferiori alle esigenze, attendere che tutti i dati vengano ricevuti e quindi avviare l'operazione di lettura.

Nell'esempio seguente è m_dwExpected il numero approssimativo di byte che l'utente si aspetta di ricevere. Si presuppone che venga dichiarata 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

Quando si usano socket MFC in thread secondari in un'applicazione MFC collegata in modo statico, è necessario chiamare AfxSocketInit in ogni thread che usa socket per inizializzare le librerie socket. Per impostazione predefinita, AfxSocketInit viene chiamato solo nel thread primario.

Per altre informazioni, vedere Windows Sockets in MFC, Windows Sockets: Using Sockets with Archives, Windows Sockets: How Sockets with Archives Work, Windows Sockets: Sequence of Operations, Windows Sockets: Example of Sockets using Archives.For more information, see Windows Sockets in MFC, Windows Sockets: Using Sockets with Archives.

Gerarchia di ereditarietà

CObject

CAsyncSocket

CSocket

Requisiti

Intestazione: afxsock.h

CSocket::Attach

Chiamare questa funzione membro per collegare l'handle hSocket a un CSocket oggetto .

BOOL Attach(SOCKET hSocket);

Parametri

hSocket
Contiene un handle per un socket.

Valore restituito

Diverso da zero se la funzione ha esito positivo.

Osservazioni:

L'handle SOCKET viene archiviato nel membro dati dell'oggetto m_hSocket .

Per altre informazioni, vedere Windows Sockets: Using Sockets with Archives .For more information, see Windows Sockets: Using Sockets with Archives.

Esempio

class CSockThread : public CWinThread
{
public:
   SOCKET m_hConnected;

protected:
   CChatSocket m_sConnected;

   // remainder of class declaration omitted.

 

BOOL CSockThread::InitInstance()
{
   // Attach the socket object to the socket handle
   // in the context of this thread.
   m_sConnected.Attach(m_hConnected);
   m_hConnected = NULL;

   return TRUE;
}

 

// This listening socket has been constructed
// in the primary thread.
void CListeningSocket::OnAccept(int nErrorCode)
{
   UNREFERENCED_PARAMETER(nErrorCode);

   // This CSocket object is used just temporarily
   // to accept the incoming connection.
   CSocket sConnected;
   Accept(sConnected);

   // Start the other thread.
   CSockThread *pSockThread = (CSockThread*)AfxBeginThread(
       RUNTIME_CLASS(CSockThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
   if (NULL != pSockThread)
   {
      // Detach the newly accepted socket and save
      // the SOCKET handle in our new thread object.
      // After detaching it, it should no longer be
      // used in the context of this thread.
      pSockThread->m_hConnected = sConnected.Detach();
      pSockThread->ResumeThread();
   }
}

CSocket::CancelBlockingCall

Chiamare questa funzione membro per annullare una chiamata di blocco attualmente in corso.

void CancelBlockingCall();

Osservazioni:

Questa funzione annulla qualsiasi operazione di blocco in sospeso per questo socket. La chiamata di blocco originale terminerà il prima possibile con l'errore WSAEINTR.

Nel caso di un'operazione di blocco Connect , l'implementazione di Windows Sockets terminerà la chiamata di blocco il prima possibile, ma potrebbe non essere possibile che le risorse socket vengano rilasciate fino al completamento della connessione (e quindi reimpostata) o al timeout. Questo è probabilmente evidente solo se l'applicazione tenta immediatamente di aprire un nuovo socket (se non sono disponibili socket) o di connettersi allo stesso peer.

L'annullamento di qualsiasi operazione diversa da Accept può lasciare il socket in uno stato indeterminato. Se un'applicazione annulla un'operazione di blocco su un socket, l'unica operazione che l'applicazione può dipendere dalla possibilità di eseguire sul socket è una chiamata a Close, anche se altre operazioni potrebbero funzionare su alcune implementazioni di Windows Sockets. Se si desidera ottenere la massima portabilità per l'applicazione, è necessario prestare attenzione a non dipendere dall'esecuzione di operazioni dopo un annullamento.

Per altre informazioni, vedere Windows Sockets: Using Sockets with Archives .For more information, see Windows Sockets: Using Sockets with Archives.

CSocket::Create

Chiamare la Create funzione membro dopo aver costruito un oggetto socket per creare il socket di Windows e collegarlo.

BOOL Create(
    UINT nSocketPort = 0,
    int nSocketType = SOCK_STREAM,
    LPCTSTR lpszSocketAddress = NULL);

Parametri

nSocketPort
Una porta specifica da usare con il socket o 0 se si vuole che MFC selezioni una porta.

nSocketType
SOCK_STREAM o SOCK_DGRAM.

lpszSocketAddress
Puntatore a una stringa contenente l'indirizzo di rete del socket connesso, un numero punteggiato, ad esempio "128.56.22.8". Passando la stringa NULL per questo parametro indica che l'istanza deve essere in ascolto dell'attività CSocket client in tutte le interfacce di rete.

Valore restituito

Diverso da zero se la funzione ha esito positivo; in caso contrario, 0 e un codice di errore specifico può essere recuperato chiamando GetLastError.

Osservazioni:

CreateBind chiama quindi per associare il socket all'indirizzo specificato. Sono supportati i tipi di socket seguenti:

  • SOCK_STREAM Fornisce flussi di byte sequenziati, affidabili, bidirezionali e basati sulla connessione. Usa Transmission Control Protocol (TCP) per la famiglia di indirizzi Internet.

  • SOCK_DGRAM Supporta datagrammi, che non sono connectionless, buffer inaffidabili di una lunghezza massima fissa (in genere piccola). Usa il protocollo UDP (User Datagram Protocol) per la famiglia di indirizzi Internet. Per usare questa opzione, non è necessario utilizzare il socket con un CArchive oggetto .

    Nota

    La Accept funzione membro accetta un riferimento a un nuovo oggetto vuoto CSocket come parametro. È necessario costruire questo oggetto prima di chiamare Accept. Tenere presente che se questo oggetto socket esce dall'ambito, la connessione si chiude. Non chiamare Create per questo nuovo oggetto socket.

Per altre informazioni sui socket di flusso e datagrammi, vedere gli articoli Windows Sockets: Background, Windows Sockets: Ports and Socketes e Windows Sockets: Using Sockets with Archives.For more information about stream and datagram sockets, see the articles Windows Sockets: Background, Windows Sockets: Ports and Socketes, and Windows Sockets: Using Sockets with Archives.

CSocket::CSocket

Costruisce un oggetto CSocket.

CSocket();

Osservazioni:

Dopo la costruzione, è necessario chiamare la Create funzione membro.

Per altre informazioni, vedere Windows Sockets: Using Sockets with Archives .For more information, see Windows Sockets: Using Sockets with Archives.

CSocket::FromHandle

Restituisce un puntatore a un CSocket oggetto .

static CSocket* PASCAL FromHandle(SOCKET hSocket);

Parametri

hSocket
Contiene un handle per un socket.

Valore restituito

Puntatore a un CSocket oggetto o NULL se non è presente alcun CSocket oggetto associato a hSocket.

Osservazioni:

Se viene specificato un SOCKET handle, se un CSocket oggetto non è associato all'handle, la funzione membro restituisce NULL e non crea un oggetto temporaneo.

Per altre informazioni, vedere Windows Sockets: Using Sockets with Archives .For more information, see Windows Sockets: Using Sockets with Archives.

CSocket::IsBlocking

Chiamare questa funzione membro per determinare se è in corso una chiamata di blocco.

BOOL IsBlocking();

Valore restituito

Diverso da zero se il socket sta bloccando; in caso contrario, 0.

Osservazioni:

Per altre informazioni, vedere Windows Sockets: Using Sockets with Archives .For more information, see Windows Sockets: Using Sockets with Archives.

CSocket::OnMessagePending

Eseguire l'override di questa funzione membro per cercare determinati messaggi da Windows e rispondere nel socket.

virtual BOOL OnMessagePending();

Valore restituito

Diverso da zero se il messaggio è stato gestito; in caso contrario, 0.

Osservazioni:

Si tratta di un override avanzato.

Il framework chiama OnMessagePending mentre il socket sta pompando i messaggi di Windows per offrire l'opportunità di gestire i messaggi di interesse per l'applicazione. Per esempi di come usare OnMessagePending, vedere l'articolo Windows Sockets: Derivazione da classi socket.

Per altre informazioni, vedere Windows Sockets: Using Sockets with Archives .For more information, see Windows Sockets: Using Sockets with Archives.

Vedi anche

CAsyncSocket Classe
Grafico della gerarchia
CAsyncSocket Classe
CSocketFile Classe