Korzystam z linku beyondtv na XP, łącząc się z hostem vista pozayondtv. Program Link zawiesza się po około 20 minutach i nie mam na to poprawki. Gdy tak się dzieje, używając tcpview, widzę, że z połączenia Link pozostało około 200 połączeń tcp zombie. Nie mogę ich usunąć, pochodzą z tego samego nieistniejącego procesu. Połączenia zawieszają się, dopóki nie uruchomię ponownie hosta. Ponowne uruchomienie to jedyny sposób, w jaki udało mi się ponownie połączyć poza Link TV. Myślę, że przyczyną tego jest błąd wyondtv, ale nie mogę uzyskać odpowiedzi na ich forach. W każdym razie chciałbym wiedzieć, czy istnieje sposób na zabicie wszystkich tych połączeń.
Edycja: w rzeczywistości około 3000 połączeń WAIT_CLOSE kumuluje się po około 40 minutach i mniej więcej wtedy klient umiera. Jeśli zamknę aplikację serwera, wszystkie te gniazda będą teraz pokazywane jako posiadane przez proces -non-existent-process w tcpview. Zrozumiale. Ale czy nie ma sposobu na ich zamknięcie bez ponownego uruchamiania?
źródło
Odpowiedzi:
Możesz używać Currports Nirsoft do monitorowania i zabijania połączeń.
Możesz zautomatyzować zabijanie wzorca połączenia za pomocą AutoHotKey.
źródło
CLOSE_WAIT oznacza, że połączenie zostało zamknięte na drugim końcu.
Oczywiście, beyondtv nie wykrywa tego stanu i nadal wysyła dane do aplikacji na drugim końcu. Drugi koniec nie może wysłać niczego z powrotem przez to połączenie, ponieważ zamknął swój koniec połączenia.
Rozwiązaniem jest ustawienie wpisu TcpTimedWaitDelay w
Domyślnie na moim komputerze zawiera ona wartość -1, co rozumiem przez to, że zamknięte połączenia nigdy nie są zwalniane, co dokładnie obserwujesz.
Sugeruję, aby ustawić wartość tego wpisu w dozwolonym zakresie 30–300 sekund. Podejrzewam, że 300 sekund = 5 minut jest całkowicie wystarczające dla twojego przypadku, gdzie zamrożenie twojego komputera zajmuje 40 minut.
źródło
TIME_WAIT
przywiodło mnie tutaj. Dzięki za wyjaśnienie i link.Możesz być w stanie zmusić system Windows do wymuszenia zamknięcia wszystkich połączeń TCP przez 1) wyłączenie , a następnie 2) ponowne włączenie interfejsu sieciowego. Jeśli to zadziała, możesz w skrypcie wsadowym wykonać kroki, które należy wykonać w razie potrzeby.
Szukałem jakiegoś sposobu, aby to zrobić za pomocą wiersza polecenia, z
netsh
narzędzia (lub podobnego), ale jak dotąd nie miałem szczęścia.Oczywiście najlepszym sposobem na to jest naprawienie uszkodzonej aplikacji. Upewnij się, że próbujesz najnowszej wersji aplikacji; wkurzaj programistów; jeśli masz już najnowszą wersję, spróbuj zlokalizować starszą wersję programu.
źródło
Prawdopodobnie otrzymujesz te sesje CLOSE_WAIT z powodu zawieszenia programu - nie wiem, czy podejrzewasz je jako przyczynę, więc chciałem to wyjaśnić.
Domyślam się, że nie będą się kręcić wiecznie; prawdopodobnie tylko przez 2 godziny i 5 sekund. Wiem, że to może trwać wieczność. Możesz spróbować dostroić KeepAliveTime (prawdopodobnie wymaga ostatniego ponownego uruchomienia) dla połączenia sieciowego w dół do czegoś małego, na przykład 5 minut. Może to pomóc im szybciej zniknąć po zawieszeniu się programu.
Lub jeśli wiesz, że możesz uruchomić program niezawodnie przez, powiedzmy, 10 minut na raz, możesz go okresowo ponownie uruchamiać. Nie wiem, czy którekolwiek z tych rozwiązań są przydatne w konkretnej sytuacji; Zgadzam się z ~ szarlatanem, że należy jak najszybciej porzucić problematyczną wersję aplikacji.
źródło
Sprawdź, czy beyondtv uruchamia inny proces, który utrzymuje połączenia otwarte. Process Explorer pokaże Ci, czy tak się dzieje.
źródło
Czy to możliwe, że występuje problem z zaporą? Próbowanie i ponawianie połączenia może być niekompletne.
Wyłączyłbym wszystkie zapory ogniowe na obu komputerach, a jeśli jest router, również jego zapora wewnętrzna.
źródło
Wypróbuj poprawkę do WinSock XP.
http://www.snapfiles.com/get/winsockxpfix.html
Niszczy połączenie i resetuje je z powrotem do ustawień domyślnych. Zawsze trzymam to na dysku, gdy wszystko inne zawiedzie.
źródło