Pergunta

Eu li o impulso asio referência, atravessou o tutorial e olhou para alguns dos exemplos. Ainda assim, eu sou incapaz de ver como uma luva deve ser demolida:

  1. Devo chamar close () ou isso é feito pelo destruidor da tomada?
  2. Quando devo chamar shutdown ()
  3. Quais são os efeitos de shutdown ()? Estou ciente de que "desabilita envia ou recebe", mas como isso é feito? O que posso esperar, se eu enviar ou receber utilizando a tomada depois que foi desativado?
  4. Quais os erros que posso esperar de close ()
Foi útil?

Solução

Uma vez que este é um multi-pergunta, eu vou fazer o meu melhor para responder a cada parte a sua satisfação:

1) Tem sido minha experiência com soquetes ASIO que as alças destructor fechando o socket. No entanto, eu só lidei com sockets TCP. A melhor maneira de verificar isso é simplesmente olhar para o código para o destruidor para ver se ele faz qualquer coisa que se assemelha a um perto. Eu sei que o código Boost pode ser um pouco complicado para percorrer, por isso pode ser mais fácil simplesmente criar um pequeno programa de exemplo que abre um socket UDP e, em seguida, destrói-lo. Dessa forma, você pode percorrer o código em um depurador de seguir a lógica.

Uma vez que os designers de impulso levou isso em conta para sockets TCP, eu tenho um tempo difícil imaginar que não iria fazer o mesmo para sockets UDP.

shutdown() 2) chamada somente quando você sente que é necessário para evitar qualquer código de realizar um recv futuro e / ou send no soquete. Não é normalmente necessário, embora eu já vi isso usado em sockets TCP para forçar o soquete para enviar uma RST quando ele é fechado (em oposição ao padrão shutdown "graciosa" onde pendentes envia são processados).

3) Você pode pensar de tomadas como sendo uma forma de dois canais de comunicação: uma para leitura, o outro para o envio. Você pode desligar qualquer um independentemente do outro, e você pode continuar a usar um canal quando o outro é desligado (ou seja, você ainda pode receber depois de desligar para enviar e vice-versa). Fechando um soquete é idêntico ao chamar desligamento em ambos recv e enviar.

Desligar para recv simplesmente impede que o código de leitura mais dados. Se você tentar fazer isso, você receberá um erro de soquete. Da mesma forma, se o outro lado das tentativas de conexão para enviar dados para você, ele vai receber um erro (sorry para mudar para o mundo TCP novamente, mas eu acredito que uma RST fica respondeu de volta para o remetente).

Desligar para envio da mesma forma impede que o código de enviar mais dados. Se a memória não me falha, este parece idêntico ao que acontece quando você fecha um socket (um pacote de comprimento zero é enviado através de sinalizar o outro lado que o canal particular foi desligado). Quaisquer futuras tentativas para enviar retornará um erro.

4) Você tem que verificar seus documentos de saber ao certo. MSDN lhe dará uma indicação muito bom, embora eu não sei que eu considero ser autoritário.

Outras dicas

A partir dos exemplos dados no site Boost, parece que você deve simplesmente usar close (). Por exemplo, olhar para este:

void connection::stop()
{
  socket_.close();
}

tomadas a partir deste endereço: HTTP Server

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