Wywołanie close
i shutdown
ma dwa różne efekty na podstawowym gnieździe.
Pierwszą rzeczą, na którą należy zwrócić uwagę, jest to, że gniazdo jest zasobem w bazowym systemie operacyjnym i wiele procesów może mieć uchwyt dla tego samego podstawowego gniazda.
Gdy close
go wywołasz , zmniejsza liczbę uchwytów o jeden i jeśli liczba uchwytów osiągnęła zero, gniazdo i skojarzone z nim połączenie przechodzą przez normalną procedurę zamykania (skutecznie wysyłając FIN / EOF do peera), a gniazdo jest zwalniane.
Należy tutaj zwrócić uwagę na to, że jeśli liczba uchwytów nie osiąga zera, ponieważ inny proces nadal ma uchwyt do gniazda, połączenie nie jest zamykane, a gniazdo nie jest zwalniane.
Z drugiej strony wywołanie shutdown
odczytu i zapisu zamyka podstawowe połączenie i wysyła FIN / EOF do peera, niezależnie od tego, ile procesów ma uchwyty do gniazda. Jednak nie zwalnia gniazda i nadal trzeba wywołać polecenie close.
shutdown()
robi :).shutdown()
i dzwonić do następnej linii.close()
? A może pomiędzy nimi powinno być opóźnienie?Wyjaśnienie zamykania i zamykania: bezpieczne zamykanie (msdn)
Shutdown (w twoim przypadku) wskazuje na drugi koniec połączenia, że nie ma dalszej intencji odczytu lub zapisu do gniazda. Następnie zamknięcie zwalnia pamięć związaną z gniazdem.
Pominięcie wyłączenia może spowodować, że gniazdo pozostanie w stosie systemów operacyjnych, dopóki połączenie nie zostanie prawidłowo zamknięte.
IMO nazwy „zamknij” i „zamknij” są mylące, a „zamknij” i „zniszcz” podkreślałyby ich różnice.
źródło
jest to wspomniane bezpośrednio w Socket Programming HOWTO ( py2 / py3 )
źródło
close()
wystarczy. Dokumentacja Pythona powinna zostać poprawiona.Czy ten kod nie jest zły?
Wywołanie close bezpośrednio po wywołaniu shutdown może spowodować, że jądro i tak porzuci wszystkie bufory wychodzące.
Według http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable należy odczekać od wyłączenia do zamknij, dopóki odczyt nie zwróci 0.
źródło
istnieje kilka rodzajów zamykania: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.shutdown.aspx . * nix jest podobny.
źródło
Shutdown (1), wymusza na gnieździe nie wysyłanie dalszych danych
Jest to przydatne
1- Płukanie bufora
2- Dziwne wykrywanie błędów
3- Bezpieczna ochrona
Pozwól, że wyjaśnię więcej, kiedy wysyłasz dane z A do B, nie ma gwarancji, że zostanie wysłany do B, gwarantuje się tylko wysłanie do bufora A os, który z kolei przesyła je do bufora B os
Więc wywołując shutdown (1) na A, opróżniasz bufor A i zgłaszany jest błąd, jeśli bufor nie jest pusty, tj .: dane nie zostały jeszcze wysłane do peera
Jednak jest to nieodwracalne, więc możesz to zrobić po całkowitym wysłaniu wszystkich danych i chcesz mieć pewność, że są one przynajmniej w buforze peer OS
źródło