Chamando close
e shutdown
tem dois efeitos diferentes no soquete subjacente.
A primeira coisa a salientar é que o soquete é um recurso no SO subjacente e vários processos podem ter um identificador para o mesmo soquete subjacente.
Quando você o chama close
, diminui a contagem de identificadores em um e se a contagem de identificadores atingiu zero, o soquete e a conexão associada passam pelo procedimento de fechamento normal (enviando efetivamente um FIN / EOF para o par) e o soquete é desalocado.
O que devemos prestar atenção aqui é que, se a contagem de identificadores não atingir zero, porque outro processo ainda possui um identificador no soquete, a conexão não será fechada e o soquete não será desalocado.
Por outro lado, solicitar shutdown
leitura e gravação fecha a conexão subjacente e envia um FIN / EOF para o par, independentemente de quantos processos possuam identificadores para o soquete. No entanto, ele não desaloca o soquete e você ainda precisa ligar mais tarde.
shutdown()
faz :).shutdown()
e na próxima linha.close()
? Ou deve haver um atraso no meio?Explicação do encerramento e fechamento: Encerramento gracioso (msdn)
O desligamento (no seu caso) indica para a outra extremidade da conexão que não há mais intenção de ler ou gravar no soquete. Em seguida, feche libera qualquer memória associada ao soquete.
A omissão do desligamento pode fazer com que o soquete permaneça na pilha dos sistemas operacionais até que a conexão seja fechada normalmente.
Na IMO, os nomes 'shutdown' e 'close' são enganosos, 'close' e 'destroy' enfatizam suas diferenças.
fonte
isso é mencionado diretamente no Socket Programming HOWTO ( py2 / py3 )
fonte
close()
é suficiente. A documentação do Python deve ser corrigida.Esse código acima não está errado?
A chamada de fechamento diretamente após a chamada de encerramento pode fazer com que o kernel descarte todos os buffers de saída de qualquer maneira.
De acordo com http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-ou-why-is-my-tcp-not-reliable, é preciso esperar entre o desligamento e o fecha até que a leitura retorne 0.
fonte
existem alguns tipos de desligamento: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.shutdown.aspx . * nix é semelhante.
fonte
Shutdown (1), força o soquete no a enviar mais dados
Isso é útil em
1- Lavagem do tampão
2- Detecção de erro estranho
3- Proteção segura
Deixe-me explicar mais: quando você envia dados de A para B, não é garantido que ele seja enviado para B, apenas para o buffer A, que por sua vez os envia para o buffer OS
Então, chamando shutdown (1) em A, você libera o buffer de A e um erro é gerado se o buffer não estiver vazio, ou seja: os dados ainda não foram enviados para o par
No entanto, isso é irrecuperável, para que você possa fazer isso depois de enviar todos os seus dados completamente e desejar ter certeza de que estão no buffer do sistema operacional de mesmo nível
fonte