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 |
Em que nPort é um número de porta. Confira Windows Sockets: portas e endereços de soquete para obter detalhes sobre portas.
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.Em que nPort é um número de porta e strAddr é um endereço de computador ou um endereço IP (Internet Protocol).
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.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 chameCreate
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.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