Partilhar via


CSocket Classe

Observação

A biblioteca Microsoft Foundation Classes (MFC) continua a ser suportada. No entanto, já não estamos a adicionar funcionalidades nem a atualizar a documentação.

Deriva de CAsyncSocket, herda a sua encapsulação da API Windows Sockets e representa um nível de abstração superior ao de um CAsyncSocket objeto.

Sintaxe

class CSocket : public CAsyncSocket

Membros

Construtores Públicos

Nome Description
CSocket::CSocket Constrói um CSocket objeto.

Métodos Públicos

Nome Description
CSocket::Attach Prende uma SOCKET pega a um CSocket objeto.
CSocket::CancelBlockingCall Cancela uma chamada bloqueadora que está em curso.
CSocket::Create Cria um soquete.
CSocket::FromHandle Devolve um ponteiro a um CSocket objeto, dado um SOCKET alçado.
CSocket::IsBlocking Determina se uma chamada de bloqueio está em curso.

Métodos Protegidos

Nome Description
CSocket::OnMessagePending Chamado para processar mensagens pendentes enquanto aguardo que uma chamada bloqueadora termine.

Observações

CSocket trabalha com classes CSocketFile e CArchive para gerir o envio e receção de dados.

Um CSocket objeto também fornece bloqueio, que é essencial para a operação síncrona de CArchive. Funções de bloqueio, como , , , , e Accept (todas herdadas de CAsyncSocket), não retornam um WSAEWOULDBLOCK erro em CSocket. SendToReceiveFromSendReceive Em vez disso, estas funções aguardam até que a operação termine. Além disso, a chamada original termina com o erro WSAEINTR se CancelBlockingCall for chamada enquanto uma destas funções está a bloquear.

Para usar um CSocket objeto, chame o construtor, depois chame Create para criar o handle subjacente SOCKET (tipo SOCKET). Os parâmetros padrão são criar Create um socket de fluxo, mas se não estiveres a usar o socket com um CArchive objeto, podes especificar um parâmetro para criar um socket de datagrama em vez disso, ou associar a uma porta específica para criar um socket servidor. Liga-te a um socket cliente usando Connect o lado do cliente e Accept o lado do servidor. Depois cria um CSocketFile objeto e associa-o ao CSocket objeto no CSocketFile construtor. De seguida, crie um CArchive objeto para enviar e outro para receber dados (conforme necessário), depois associe-os ao CSocketFile objeto no CArchive construtor. Quando as comunicações estiverem concluídas, destrua os CArchive, CSocketFile, e CSocket os objetos. O SOCKET tipo de dado é descrito no artigo Windows Sockets: Contexto.

Quando usa com e , pode deparar-se com uma situação em que CSocket::Receive entra num ciclo (por PumpMessages(FD_READ)) à espera do número pedido de bytes.CSocketCSocketFileCArchive Isto porque os sockets do Windows permitem apenas uma chamada de recv por FD_READ notificação, mas CSocketFile também CSocket permitem múltiplas chamadas de recv por FD_READ. Se aparecer um FD_READ quando não há dados para ler, a aplicação bloqueia. Se nunca receberes outro FD_READ, a aplicação deixa de comunicar pelo soquete.

Pode resolver este problema da seguinte forma. No OnReceive método da sua classe socket, chame CAsyncSocket::IOCtl(FIONREAD, ...) antes de chamar o Serialize método da sua classe de mensagem quando os dados esperados a serem lidos do socket excedem o tamanho de um pacote TCP (unidade máxima de transmissão do meio de rede, normalmente pelo menos 1096 bytes). Se o tamanho dos dados disponíveis for inferior ao necessário, espere que todos os dados sejam recebidos e só então inicie a operação de leitura.

No exemplo seguinte, m_dwExpected é o número aproximado de bytes que o utilizador espera receber. Assume-se que a declaras noutro local do teu código.

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
   }
}

Observação

Ao usar soquetes MFC em threads secundários em um aplicativo MFC vinculado estaticamente, você deve chamar AfxSocketInit cada thread que usa soquetes para inicializar as bibliotecas de soquetes. Por padrão, AfxSocketInit é chamado apenas no thread primário.

Para mais informações, consulte Windows Sockets em MFC, Windows Sockets: Usar Sockets com Arquivos, Windows Sockets: Como Funcionam os Sockets com Arquivos, Windows Sockets: Sequência de Operações, Windows Sockets: Exemplo de Sockets a Usar Arquivos.

Hierarquia de herança

CObject

CAsyncSocket

CSocket

Requerimentos

Cabeçalho:afxsock.h

CSocket::Attach

Chame esta função membro para anexar o hSocket cabo a um CSocket objeto.

BOOL Attach(SOCKET hSocket);

Parâmetros

hSocket
Contém uma pega para um soquete.

Valor de retorno

Diferente de zero se a função for bem-sucedida.

Observações

O SOCKET handle é armazenado no membro de dados do m_hSocket objeto.

Para mais informações, consulte Windows Sockets: Usar Sockets com Arquivos.

Example

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

Chame esta função de membro para cancelar uma chamada bloqueada em curso.

void CancelBlockingCall();

Observações

Esta função cancela qualquer operação de bloqueio pendente para este soquete. A chamada bloqueante original terminará o mais rapidamente possível com o erro WSAEINTR.

No caso de uma operação de bloqueio Connect , a implementação do Windows Sockets terminará a chamada de bloqueio o mais rapidamente possível, mas pode não ser possível libertar os recursos do socket até que a ligação tenha sido concluída (e depois reiniciada) ou expirada no tempo. Isto só será notório se a aplicação tentar imediatamente abrir uma nova tomada (se não houver soquetes disponíveis), ou se ligar ao mesmo par.

Cancelar qualquer operação que não Accept seja pode deixar o soquete num estado indeterminado. Se uma aplicação cancelar uma operação de bloqueio num socket, a única operação da qual a aplicação pode depender para realizar no socket é uma chamada para Close, embora outras operações possam funcionar em algumas implementações do Windows Sockets. Se pretende a máxima portabilidade para a sua aplicação, deve ter cuidado para não depender da realização de operações após um cancelamento.

Para mais informações, consulte Windows Sockets: Usar Sockets com Arquivos.

CSocket::Create

Chame a Create função membro depois de construir um objeto socket para criar o socket do Windows e anexá-lo.

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

Parâmetros

nSocketPort
Uma porta específica para usar com o soquete, ou 0 se quiseres que o MFC selecione uma porta.

nSocketType
SOCK_STREAM ou SOCK_DGRAM.

lpszSocketAddress
Um ponteiro para uma cadeia contendo o endereço de rede do socket ligado, um número pontilhado como "128.56.22.8". Passar a string NULL para este parâmetro indica que a CSocket instância deve ouvir a atividade do cliente em todas as interfaces de rede.

Valor de retorno

Não nula se a função for bem-sucedida; caso contrário, 0, e um código de erro específico pode ser recuperado chamando GetLastError.

Observações

Create depois chamadas Bind para associar o socket ao endereço especificado. São suportados os seguintes tipos de soquetes:

  • SOCK_STREAM Fornece fluxos de bytes sequenciados, fiáveis, bidirecionais e baseados em ligação. Utiliza o Protocolo de Controlo de Transmissão (TCP) para a família de endereços da Internet.

  • SOCK_DGRAM Suporta datagramas, que são buffers sem ligação e pouco fiáveis de comprimento máximo fixo (tipicamente pequeno). Utiliza o Protocolo de Datagramas de Utilizador (UDP) para a família de endereços da Internet. Para usar esta opção, não deve usar o soquete com um CArchive objeto.

    Observação

    A Accept função member usa uma referência a um novo objeto vazio CSocket como parâmetro. Você deve construir este objeto antes de chamar Accept. Tenha em mente que, se este objeto de soquete sair do âmbito de alcance, a ligação fecha-se. Não chame Create este novo objeto de soquete.

Para mais informações sobre sockets de fluxo e datagramas, consulte os artigos Windows Sockets: Background, Windows Sockets: Ports and Socket Addresses, e Windows Sockets: Using Sockets with Archives.

CSocket::CSocket

Constrói um CSocket objeto.

CSocket();

Observações

Após a construção, deve chamar a Create função do membro.

Para mais informações, consulte Windows Sockets: Usar Sockets com Arquivos.

CSocket::FromHandle

Devolve um ponteiro para um CSocket objeto.

static CSocket* PASCAL FromHandle(SOCKET hSocket);

Parâmetros

hSocket
Contém uma pega para um soquete.

Valor de retorno

Um apontador para um CSocket objeto, ou NULL se não CSocket houver nenhum objeto anexado a hSocket.

Observações

Quando dado um SOCKET handle, se um CSocket objeto não estiver associado ao handle, a função membro retorna NULL e não cria um objeto temporário.

Para mais informações, consulte Windows Sockets: Usar Sockets com Arquivos.

CSocket::IsBlocking

Chame esta função de membro para determinar se está em curso uma chamada de bloqueio.

BOOL IsBlocking();

Valor de retorno

Não nulo se o soquete estiver a bloquear; caso contrário, 0.

Observações

Para mais informações, consulte Windows Sockets: Usar Sockets com Arquivos.

CSocket::OnMessagePending

Substitua esta função de membro para procurar mensagens específicas do Windows e responde-lhes no socket.

virtual BOOL OnMessagePending();

Valor de retorno

Não nula se a mensagem foi tratada; caso contrário, 0.

Observações

Isto é um ultrapassível avançado.

O framework chama OnMessagePending enquanto o socket está a enviar mensagens do Windows para lhe dar a oportunidade de lidar com mensagens de interesse para a sua aplicação. Para exemplos de como pode usar OnMessagePending, veja o artigo Windows Sockets: Derivando de Classes de Socket.

Para mais informações, consulte Windows Sockets: Usar Sockets com Arquivos.

Consulte também

CAsyncSocket Classe
Gráfico de Hierarquia
CAsyncSocket Classe
CSocketFile Classe