Czy jest to bezpieczne/bezpieczne dla close()
gniazdo bezpośrednio po ostatnim send()
?zamknij() gniazdo bezpośrednio po wysłaniu(): niebezpieczne?
Wiem, że TCP powinien spróbować dostarczyć wszystkie pozostałe dane w buforze wysyłania, nawet po zamknięciu gniazda, ale czy naprawdę mogę na to liczyć?
Upewniam się, że nie ma żadnych pozostałych danych w buforze odbiorczym, aby po moim zamknięciu nie zostały wysłane żadne RST.
W moim przypadku, blisko jest faktycznie bardzo ostatnie stwierdzenie kodu przed wywołaniem exit()
.
Czy stos TCP naprawdę będzie próbował przesłać dane nawet po zakończeniu procesu wysyłania? Czy to jest tak niezawodne, jak czekanie na samowolny limit czasu przed wywołaniem close()
poprzez ustawienie SO_LINGER?
Czy stosuje się te same limity czasu TCP, czy są one krótsze? Przy dużym buforze wysyłania i powolnym połączeniu czas na przeniesienie wszystkich buforowanych danych może być w końcu znaczny.
Nie jestem w ogóle zainteresowany otrzymywaniem powiadomienia o wysłaniu ostatniego bajtu; Po prostu chcę, żeby w końcu dotarli do zdalnego hosta tak niezawodnie, jak to tylko możliwe.
Potwierdzenia warstwy aplikacji nie są opcją (protokół to HTTP, a ja piszę mały serwer).
To zależy od implementacji, ale ogólnie rzecz biorąc, tak, 'close()' wypróżni wszelkie dane pozostające w buforze, zanim faktycznie rozerwie gniazdo. Przebieg może się różnić, jeśli zakończysz cały proces oprócz wywołania 'close()'. – aroth
@aroth Mileage * nie * będzie się różnić, jeśli zakończysz proces. Nie ma różnicy między tymi dwoma przypadkami. Jeśli chcesz zachować przeciwwagę, podaj autorytatywne odniesienie. – EJP
@EJP - autorytatywne odniesienie do tego, co * może * zdarzyć się w arbitralnych programach? Nie sądzę, że coś takiego istnieje. Ale jest to dość proste, aby przyjąć prawdopodobny przykład. Załóżmy, że masz program, który deleguje wszystkie operacje sieciowe do osobnego wątku, jak większość programów. Istnieje możliwość, że główny wątek zakończy proces (z wdziękiem lub w inny sposób), podczas gdy wątek tła wywołuje funkcję 'close()'. Czy połączenie zostanie wykonane w takim przypadku? Wątpię. To prawda, że to, co powinieneś powiedzieć, powinno być prawdziwe w przypadku programów jednowątkowych. Ale nie wszystkie programy są jednowątkowe. – aroth