Compartilhar via


Classe CSocket

Deriva de CAsyncSocket e herda seu encapsulamento da representa um nível mais alto de abstração da API do Windows Sockets que de um CAsyncSocket objeto.

class CSocket : public CAsyncSocket

Comentários

CSocket funciona com classes CSocketFile e CArchive para gerenciar o envio e recebimento de dados.

A CSocket objeto também fornece o bloqueio, que é essencial para a operação síncrono do CArchive. Bloqueio de funções, sistema autônomo Receber, Enviar, ReceiveFrom, SendTo, e Aceitar (todos herdados de CAsyncSocket), não retorne uma WSAEWOULDBLOCK erro in CSocket. Em vez disso, essas funções aguardar até que a operação for concluída.Além disso, a telefonar original terminará com o erro WSAEINTR if CancelBlockingCall é chamado durante uma dessas funções está bloqueando.

Para usar um CSocket objeto, telefonar construtor, em seguida telefonar Criar para criar a base SOQUETE alça (tipo de SOQUETE).Os parâmetros padrão de Criar criar um soquete de fluxo, mas se você não estiver usando o soquete com um CArchive objeto, você pode especificar um parâmetro para criar um soquete de datagrama em vez disso, ou BIND a uma porta específica para criar um soquete do servidor. Conectar-se a um soquete de cliente usando Conectar-se no lado do cliente e Aceitar no lado do servidor.Then criar a CSocketFile objeto e associá-lo para o CSocket objeto na CSocketFile construtor. Em seguida, crie um CArchive objeto para o envio e outro para receber dados (sistema autônomo necessário), então sistema autônomo sociate-los com o CSocketFile objeto na CArchive construtor. Quando comunicações forem concluídas, destruir o CArchive, CSocketFile, e CSocket objetos. The SOQUETE tipo de dados é descrito no artigo Windows Sockets: Plano de fundo.

Quando você usa CArchive com CSocketFile e CSocket, você pode encontrar uma situação em que CSocket::Receive entra em um loop (por PumpMessages(FD_READ)) Aguardando a quantidade de bytes solicitada.Isso ocorre porque o Windows sockets permitem apenas uma telefonar recv por notificação FD_READ mas CSocketFile e CSocket permitir que várias chamadas recv por FD_READ. Se você obtiver um FD_READ quando não houver nenhum dado a ser lido, o aplicativo trava.Se outro FD_READ nunca, o aplicativo pára se comunicam através do soquete.

Você pode resolver esse problema da seguinte maneira.No OnReceive método de sua classe de soquete, telefonar CAsyncSocket::IOCtl (FIONREAD...) antes de chamar o Serialize método de sua classe de mensagens quando os dados esperados para ser lido do soquete excedem o dimensionar de um pacote TCP (unidade máxima de transmissão de meio de rede, geralmente pelo menos 1096 bytes). Se o dimensionar dos dados disponível é menor do que o necessário, aguarde até que todos os dados a ser recebido e, em seguida, somente iniciar a operação de leitura.

No exemplo a seguir, m_dwExpected é o número aproximado de bytes que o usuário espera receber. Supõe-se que você declare-lo em outro lugar no seu 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
   }
}

Para obter mais informações, consulte Windows Sockets no MFC, Windows Sockets: Usando soquetes com arquivosWindows Sockets: Como funcionam os soquetes com arquivosWindows Sockets: sequência de operaçõesWindows Sockets: Exemplo de soquetes de segurança usando arquivos.

Requisitos

Cabeçalho: afxsock.h

Consulte também

Referência

Classe CAsyncSocket

Gráfico de hierarquia

Classe CAsyncSocket

Classe CSocketFile

Outros recursos

CSocket membros