Comunicação servidor-cliente assíncrona e multidirecional no mesmo soquete aberto?

StackOverflow https://stackoverflow.com/questions/1241

  •  08-06-2019
  •  | 
  •  

Pergunta

Eu tenho um aplicativo cliente-servidor em que o cliente está em um dispositivo Windows Mobile 6, escrito em C++ e o servidor está em Windows completo e escrito em C#.

Originalmente, eu só precisava dele para enviar mensagens do cliente para o servidor, com o servidor apenas enviando de volta uma confirmação de que recebeu a mensagem.Agora, gostaria de atualizá-lo para que o servidor possa realmente enviar uma mensagem ao cliente solicitando dados.Como atualmente estou configurado para que o cliente só fique no modo de recebimento depois de enviar dados ao servidor, isso não permite que o servidor envie uma solicitação a qualquer momento.Eu teria que esperar pelos dados do cliente.Meu primeiro pensamento seria criar outro thread no cliente com um soquete aberto separado, ouvindo as solicitações do servidor... assim como o servidor já faz em relação ao cliente.Existe uma maneira, dentro do mesmo thread e usando o mesmo soquete, de todo o servidor enviar solicitações a qualquer momento?

Você pode usar algo com o efeito de WaitForMultipleObjects() e passar para ele um buffer de recebimento e um evento que informa que há dados a serem enviados?

Foi útil?

Solução

Quando precisei escrever uma aplicação com um modelo cliente-servidor onde os clientes pudessem sair e entrar quando quisessem (presumo que esse também seja o caso da sua aplicação, já que você usa dispositivos móveis), certifiquei-me de que os clientes enviassem um on-line mensagem para o servidor, indicando que eles estavam conectados e prontos para fazer o que precisassem.

naquele momento, o servidor poderia enviar mensagens de volta ao cliente através da mesma conexão aberta.

Além disso, mas não sei se isso se aplica a você, tive algum tipo de batimento cardiaco os clientes enviaram para o servidor, informando que ainda estava online.Dessa forma, o servidor sabe quando um cliente foi desconectado à força da rede e pode marcá-lo novamente como offline.

Outras dicas

Usar comunicação assíncrona é totalmente possível em thread único!

Existe um padrão de projeto comum no desenvolvimento de software de rede chamado padrão de reator (olha esse livro).Algumas bibliotecas de rede bem conhecidas fornecem uma implementação deste padrão (olha o ACE).

Resumidamente, o reator é um objeto, você registra todos os seus soquetes dentro e espera por algo.Se algo acontecer (chegarem novos dados, conexão for encerrada...) o reator irá notificá-lo.E, claro, você pode usar apenas um soquete para enviar e receber dados de forma assíncrona.

Não estou claro se você deseja ou não adicionar os bits assíncronos ao servidor em C# ou ao cliente em C++.

Se você está falando sobre fazer isso em C++, as plataformas de desktop Windows podem executar E/S de soquete de forma assíncrona por meio de APIs que usam E/S sobrepostas.Para soquetes, WSASend e WSARecv permitem E/S assíncrona (leia a documentação sobre seus parâmetros LPOVERLAPPED, que você pode preencher com eventos que são definidos quando a E/S é concluída).

Não sei se as plataformas Windows Mobile suportam essas funções, então talvez seja necessário fazer algumas pesquisas adicionais.

Confira asio.É uma biblioteca C++ compatível entre si para E/S assíncrona.Não tenho certeza se isso seria útil para o servidor (nunca tentei vincular uma DLL c++ padrão a um projeto c#), mas para o cliente seria útil.

Nós o usamos com nosso aplicativo e ele resolveu a maioria dos nossos problemas de simultaneidade de IO.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top