Pergunta

Tenho algumas perguntas simples, tenho um aplicativo cliente-servidor e dados enviados no fio.

Eu gostaria de poder recuperar os dados e lidar com eles corretamente.

struct T1
{
   int id;
   int foo;
};

struct T2
{
  int id;
  char foo;
  int bar;
};

Vamos pegar essas estruturas, elas são enviadas na rede precedida por um INT que informará se o T1 ou o T2 seguir. Se o cliente me enviar T1, me enviar T2, tenho a garantia de que posso ler uma estrutura completa com asio :: ip :: tcp :: soket.async_read ()? Eu gostaria de configurar um manipulador que lide com uma única estrutura, no entanto, o que acontecerá se não conseguir ler tudo em um único async_read ()?

A operação assíncrona continuará até que uma das seguintes condições seja verdadeira:

  • Os buffers fornecidos estão cheios. Ou seja, os bytes transferidos são iguais à soma dos tamanhos do buffer.
  • Um erro ocorreu.

Ele descartará os dados que não podem ser lidos? Ele desencadeará outro async_read? E, tenho certeza de que um ASYNC_READ terá apenas uma estrutura ID+se meu cliente me enviar sequencialmente a estrutura ID+? Ou o sistema operacional pode otimizar as coisas e colocá -los no mesmo Paquet? Como você pode ter visto, estou um pouco confuso, gostaria de tomar as decisões certas ao projetar um aplicativo de servidor/cliente, qualquer ajuda será apreciada.

Obrigada.

Foi útil?

Solução

EDIT: Obrigado ao @Timo por apontar um erro. Async_read não concluirá até que uma estrutura inteira seja lida, para que você não precise fazer loop. Caso contrário, minha resposta é a mesma. Nada será perdido, independentemente de como o protocolo TCP quebra ou coales os dados.

Se não houver dados suficientes nos buffers TCP para preencher seu buffer de entrada, a leitura simplesmente buscará o que estiver disponível e relatará o número de bytes buscados. O que acontece a seguir depende de ti. Você pode ter dados suficientes nos bytes buscados para decidir que não deseja continuar, para que a ASIO não faça suposições. Se você não leu bytes suficientes para compreender uma estrutura completa, inicie mais um ASYNC_READ, repetindo o processo até que você tenha bytes suficientes ou algo que morra.

Não tenho certeza do que você quer dizer com "Incapaz de ler tudo". Dois significados possíveis vêm à mente:

  1. A quantidade de dados disponíveis para leitura não preenche uma estrutura. Nesse caso, você simplesmente faz outro read_async para aguardar mais dados.
  2. A estrutura não absorve todos os dados que chegaram. A pilha TCP simplesmente bufferá os dados não lidos até você ler isso.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top