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