comunicação cliente-servidor assíncrona multi-direção ao longo do mesmo soquete aberto?

votos
20

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

Originalmente, eu só precisava para enviar mensagens a partir do cliente para o servidor, com o servidor sempre apenas enviar de volta um reconhecimento que recebeu a mensagem. Agora, eu gostaria de atualizá-lo para que o servidor pode realmente enviar uma mensagem para o cliente para dados de solicitação. Como eu atualmente tem que configurar para que o cliente é apenas em modo de recepção após ele envia dados para o servidor, isso não permite que o servidor para enviar um pedido a qualquer momento. Eu teria que esperar por dados de clientes. Meu primeiro pensamento seria criar outro segmento no cliente com uma tomada aberta em separado, para ouvir as solicitações do servidor ... assim como o servidor já tem em relação ao cliente. Existe uma maneira, dentro do mesmo segmento e usar o mesmo soquete, para todo o servidor para enviar pedidos a qualquer momento?

Você pode usar algo para o efeito de WaitForMultipleObjects()e passá-lo um buffer de recepção e um evento que diz que não há dados a serem enviados?

Publicado 04/08/2008 em 14:52
fonte usuário
Em outras línguas...                            


4 respostas

votos
7

Usando comunicação assíncrona é totalmente possível em único fio!

Existe um padrão de design comum no desenvolvimento de software de rede chamado o padrão reator ( olhada neste livro ). Alguns biblioteca de rede bem conhecida fornece uma implementação desse padrão ( olhar para ACE ).

Resumidamente, o reator é um objeto, você registra todos os seus soquetes dentro, e você esperar por algo. Se algo aconteceu (novos dados chegaram, estreita ligação ...) o reator irá notificá-lo. E, claro, você pode usar apenas uma tomada para enviar e receber dados de forma assíncrona.

Respondeu 17/08/2008 em 14:53
fonte usuário

votos
7

Quando eu precisava para escrever um aplicativo com um modelo cliente-servidor, onde os clientes podem entrar e sair quando quiserem, (suponho que é também o caso para a sua aplicação como você usa dispositivos móveis) tenho a certeza que os clientes enviam uma linha mensagem para o servidor, indicando que eles estavam ligados e prontos para fazer o que precisava ser feito.

altura em que o servidor pode enviar mensagens de volta para o cliente através da mesma conexão aberta.

Também, mas eu não sei se isso é aplicável para você, eu tinha algum tipo de batimento cardíaco dos clientes enviados para o servidor, deixando-o saber que ainda era online. Dessa forma, o servidor sabe quando um cliente foi violentamente desconectado da rede e que poderia marcar esse cliente de volta como offline.

Respondeu 04/08/2008 em 15:30
fonte usuário

votos
3

Confira asio . É uma biblioteca cruz compatível c ++ para IO asyncronous. Eu não tenho certeza se isso seria útil para o servidor (eu nunca tentou vincular uma DLL padrão c ++ ao projeto c #), mas para o cliente seria útil.

Nós usá-lo com a nossa aplicação, e resolveu a maioria dos nossos problemas de concorrência IO.

Respondeu 11/08/2008 em 11:00
fonte usuário

votos
3

Eu não sou claro sobre se ou não você está querendo adicionar os bits assíncrono para o servidor em C # ou o cliente em C ++.

Se você está falando sobre como fazer isso em C ++, desktops plataformas Windows pode fazer tomada de I / O de forma assíncrona através da API que o uso sobreposto E / S. Para sockets, WSASend, WSARecv ambos permitem async I / O (leia a documentação sobre os seus parâmetros lpOverlapped, que você pode preencher com os eventos que são criados quando o I / O completa).

Eu não sei se as plataformas Windows Mobile suportar essas funções, de modo que você pode ter que fazer alguma escavação adicional.

Respondeu 05/08/2008 em 06:30
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more