Partilhar via


Windows Sockets: sequência de operações

Este artigo ilustra, lado a lado, a sequência de operações de um soquete de servidor e um soquete do cliente. Como os soquetes usam objetos CArchive, eles são necessariamente soquetes de fluxo.

Sequência de operações para uma comunicação de soquete de fluxo

Até o ponto de construir um objeto CSocketFile, a sequência a seguir é precisa (com algumas diferenças de parâmetro) para CAsyncSocket e CSocket. Desse ponto em diante, a sequência é estritamente para CSocket. A tabela a seguir ilustra a sequência de operações para configurar a comunicação entre um cliente e um servidor.

Configurando a comunicação entre um servidor e um cliente

Servidor Cliente
// construct a socket

CSocket sockSrvr;
// construct a socket

CSocket sockClient;
// create the SOCKET

sockSrvr.Create(nPort);1,2
// create the SOCKET

sockClient.Create( );2
// start listening

sockSrvr.Listen( );
// seek a connection

sockClient.Connect(strAddr, nPort);3,4
// construct a new, empty socket

CSocket sockRecv;

// accept connection

sockSrvr.Accept( sockRecv ); 5
// construct file object

CSocketFile file(&sockRecv);
// construct file object

CSocketFile file(&sockClient);
// construct an archive

CArchive arIn(&file, CArchive::load);

-ou-

CArchive arOut(&file, CArchive::store);

- ou ambos -
// construct an archive

CArchive arIn(&file, CArchive::load);

-ou-

CArchive arOut(&file, CArchive::store);

- ou ambos -
// use the archive to pass data:

arIn >> dwValue;

-ou-

arOut << dwValue;6
// use the archive to pass data:

arIn >> dwValue;

-ou-

arOut << dwValue;6
  1. Em que nPort é um número de porta. Confira Windows Sockets: portas e endereços de soquete para obter detalhes sobre portas.

  2. O servidor precisa sempre especificar uma porta para que os clientes possam se conectar. Às vezes, a chamada Create também especifica um endereço. No lado do cliente, use os parâmetros padrão, que solicitam ao MFC que use qualquer porta disponível.

  3. Em que nPort é um número de porta e strAddr é um endereço de computador ou um endereço IP (Internet Protocol).

  4. Os endereços do computador podem usar várias formas: "ftp.microsoft.com", "microsoft.com". Os endereços IP usam o formato de "número com pontos" "127.54.67.32". A função Connect verifica se o endereço é um número pontilhado (embora não verifique se o número é um computador válido na rede). Caso contrário, Connect pressupõe um nome de computador de um dos outros formatos.

  5. Ao chamar Accept no lado do servidor, você passa uma referência a um novo objeto de soquete. Você precisa construir esse objeto primeiro, mas não chame Create para ele. Tenha em mente que, se esse objeto de soquete ficar fora do escopo, a conexão será fechada. O MFC conecta o novo objeto a um identificador SOCKET. Você pode construir o soquete na pilha, conforme mostrado, ou no heap.

  6. O arquivo e o arquivo de soquete são fechados quando eles saem do escopo. O destruidor do objeto socket também chama a função membro Close para o objeto socket quando o objeto sai do escopo ou é excluído.

Observações adicionais sobre a sequência

A sequência de chamadas mostrada na tabela anterior é para um soquete de fluxo. Soquetes de datagrama, que são sem conexão, não exigem as chamadas CAsyncSocket::Connect, Listen e Accept (embora você possa usar Connect opcionalmente). Em vez disso, se você estiver usando a classe CAsyncSocket, os soquetes de datagrama usarão as funções membro CAsyncSocket::SendTo e ReceiveFrom. (Se usar Connect com um soquete de datagrama, você usará Send e Receive.) Como CArchive não funciona com datagramas, não use CSocket com um arquivo morto se o soquete for um datagrama.

CSocketFile não dá suporte a toda a funcionalidade de CFile; membros de CFile, como Seek, que não fazem sentido para uma comunicação de soquete, não estão disponíveis. Por isso, algumas funções Serialize MFC padrão não são compatíveis com CSocketFile. Isso é particularmente verdadeiro para a classe CEditView. Você não deve tentar serializar dados de CEditView por meio de um objeto CArchive anexado a um objeto CSocketFile usando CEditView::SerializeRaw; use CEditView::Serialize em vez disso (não documentado). A função SerializeRaw espera que o objeto de arquivo tenha funções, como Seek, incompatíveis com CSocketFile.

Para saber mais, veja:

Confira também

Windows Sockets em MFC
Classe CSocket
CAsyncSocket::Create
CAsyncSocket::Close