Windows Sockets: sequência de operações
Este artigo ilustra, lado a lado, a sequência de operações para um soquete de servidor e um soquete de cliente. Como os soquetes usam objetos de CArchive , são necessariamente soquetes de fluxo.
Sequência de operações para comunicação de soquete de fluxo
Até o ponto de construir um objeto de CSocketFile , a seguinte sequência é exata (com algumas diferenças de parâmetro) para CAsyncSocket e CSocket. A partir desse ponto, 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.
Comunicação do entre um servidor e 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. nPort onde é um número de porta. Consulte Soquetes do windows: Portas e endereço de soquete para obter detalhes sobre portas.
2. O servidor deve sempre especificar uma porta de forma que os clientes podem se conectar. A chamada de Criar às vezes também especifica um endereço. No lado do cliente, use os parâmetros padrão, que solicitam MFC o para usar qualquer porta disponível.
3. nPort onde é um número de porta e um strAddr são endereço do computador ou um endereço IP (IP).
4. Os endereços de computador podem demorar vários formulários: “ftp.microsoft.com”, “microsoft.com”. Os endereços IP “usam o formato “127.54.67.32” do número pontilhado.” As verificações de função de Conectar para verificar se o endereço é um número pontilhado (embora não verifica para assegurar que o número for um computador válido na rede). Caso contrário, Conectar assume um nome de computador de um dos outros formulários.
5. Quando você chama Aceitar no lado do servidor, você passa uma referência para um novo objeto de soquete. Você deve construir esse objeto primeiro, mas não chama Criar para ele. Lembre-se de que se esse objeto de soquete sair do escopo, a conexão fecha. MFC O conectar o novo objeto para um identificador de SOCKET . Você pode construir o soquete na pilha, como mostrado, ou heap.
6. O arquivo morto e o arquivo de soquete são fechados quando sai do escopo. O destruidor do objeto de soquete também chamará a função de membro de Término para o objeto de soquete quando o objeto ou sai do escopo é excluído.
Observações adicionais sobre a sequência
A sequência de chamadas mostrados na tabela anterior é para um soquete de fluxo. Soquetes de datagrama, que não são conexão, não requerem CAsyncSocket::Connect, Escutar, e chamadas de Aceitar (embora você pode optar por usar Conectar). Em vez disso, se você estiver usando a classe CAsyncSocket, soquetes de datagrama usam as funções de membro de CAsyncSocket::SendTo e de ReceiveFrom . (Se você usar Conectar com um soquete de datagrama, você usa Enviar e Receber.) Como CArchive não funciona com datagramas, não use CSocket com um arquivo morto se o soquete é uma datagrama.
CSocketFile não oferece suporte a toda a funcionalidade de CFile ; os membros de CFile como Seek, que não pertence a nenhum sentido para comunicação de soquete, não estão disponíveis. Devido a isso, alguns usam como padrão funções de MFC Serialize não são compatíveis com CSocketFile. Isso é especialmente verdadeiro para a classe de CEditView . Você não deve tentar serializar dados de CEditView por meio de um objeto de CArchive anexado a um objeto de CSocketFile usando CEditView::SerializeRaw; use CEditView::Serialize vez (não documentado). A função de SerializeRaw espera o objeto de arquivo ter funções, como Seek, que CSocketFile não oferece suporte.
Para obter mais informações, consulte: