Dziwne zachowanie gniazda (jeden komputer - mój laptop - zaakceptuje połączenie z moim serwerem, inny - mój komputer - nie)

0

Napisałem 2 programy w Pythonie 2.7. Jeden tworzy gniazdo hosta, a drugi tworzy gniazdo klienta. Następnie próbują się połączyć. Miałem program hosta na moim komputerze i umieściłem program klienta w telefonie, który był połączony z siecią WIFI w tej samej sieci, co mój komputer. Ustawiłem program klienta (w moim telefonie, który jest w mojej sieci LAN), aby połączyć się z lokalnym adresem IP mojego komputera. Sprawdziłem błędy w moim kodzie i okazało się, że jest bezbłędny. Jednak kiedy próbowałem go uruchomić, otrzymałem bardzo dziwne zachowanie:

  1. Port jest poprawny. Nazwa hosta jest poprawna. Próbuję się połączyć. Nic się nie dzieje. Nie nawiązano połączenia.
  2. Zresetowałem komputer.
  3. Próbuję jeszcze raz. Ten sam wynik.
  4. Wyłączam zarówno moją lokalną, jak i publiczną zaporę.
  5. Teraz coś dostaję, ale tylko na moim urządzeniu klienckim: [Errno 111] Połączenie odrzucone.
  6. Włączam ponownie zapory ogniowe.
  7. Taki sam wynik jak w 1. (brak połączenia)
  8. Uruchomię program hosta na moim laptopie. Próbuję się połączyć. To działa!
  9. Zresetowałem router i ponownie uruchomiłem program hosta na komputerze. Taki sam wynik jak w 1.
  10. Teraz uruchamiam program klienta również na moim komputerze, podłączając go do „localhost”. To działa.
  11. Robię to samo, co w przypadku 10. ustawienia programu klienta, aby ponownie łączył się z lokalnym adresem IP mojego komputera. Błąd:

    Traceback (most recent call last):
      File "<pyshell#5>", line 1, in <module>
        s.connect(cn)
      File "C:\Python27\lib\socket.py", line 224, in meth
        return getattr(self._sock,name)(*args)
    error: [Errno 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
    

W 6. Doszedłem do wniosku, że problem jest związany z komputerem i że moje programy działają poprawnie.

Niektóre intele:

  • Windows 7 na PC i laptopie.
  • Używam Pythona 2.7.
  • Laptop i smartfon są podłączone do sieci za pośrednictwem WIFI, komputera za pomocą kabla.
  • Próbowałem różnych portów, aby upewnić się, że nie stanowią problemu.

prawdopodobnie nie tak istotne, ale tutaj jest kod dla hosta i klienta http://pastebin.com/raw/wswMi5SV

Co się dzieje?

Cosinux
źródło
1
Może to być twój kod, ale Twoje stwierdzenie „Sprawdziłem błędy w moim kodzie i okazało się, że jest bezbłędny” & lt; - to oświadczenie nonsensowne. Nigdy nie wiesz, czy twój kod jest bezbłędny. Może brakować mu pewnych wad. Ale powiedzieć, że jest bezbłędny, to nonsens. Może jakiś kod ma wadę bezpieczeństwa wynikającą z platformy, więc tak naprawdę nie można powiedzieć, że jest bezbłędny. Można powiedzieć, że nie można określić żadnej wady. I zdecydowałeś się nie udostępniać kodu, ponieważ uważasz, że jest bezbłędny. W każdym razie, twoje pytanie rodzaj granicy tak vs superużytkownik .. Może trzeba zrobić więcej rozwiązywania problemów pewnego rodzaju
barlop
więc twój program, gdy działa na konkretnym komputerze, akceptuje połączenie po raz pierwszy i nie powiedzie się po raz drugi. Podczas gdy na innych komputerach zawsze akceptuje połączenie?
barlop
możesz spróbować cygwin i nc -l -p 1234 lub nc -l 1234, (cokolwiek polecenie nc ma uzyskać serwer nasłuchujący), i spróbuj połączyć się z nim, sprawdź, czy ma ten sam problem, co twój program. (być może zawsze -l -p jest bezpieczny,)
barlop
Widzę, co miałem na myśli z bezbłędnym to, że działa na innym komputerze. To także, jak posty w Internecie mówią, że powinno się to robić. Jeśli chcesz zobaczyć kod, mogę ci go pokazać. To naprawdę proste, kilka linii. Aby odpowiedzieć na drugi komentarz: Nie działa na moim komputerze, ale działa na moim laptopie. Dziwne zachowanie polega na tym, że jeśli włączę zaporę, nic się nie dzieje (host nadal nasłuchuje i klient nadal próbuje się połączyć), a jeśli go wyłączysz, połączenie zostanie odrzucone. Jeśli chodzi o trzeci komentarz, spróbuję tego teraz i dam wam znać o wynikach.
Cosinux
Chciałbym zobaczyć kod - jestem ciekawy. Sprawdź także wyniki netstat (netstat -aon), .. zobacz adres IP, na którym nasłuchuje, czy to jest 127.0.0.1 to np. 192.168.x.y (zezwalając na łączenie się z siecią LAN), czy jest to 0.0.0.0 (pozwalające każdemu się połączyć). Możesz także wypróbować wireshark (sniffer pakietów), choć testowanie połączenia z 127.0.0.1 może nie być dobre, ale możesz podłączyć inny komputer do komputera i uruchomić wireshark na komputerze i zobaczyć, co się dzieje.
barlop

Odpowiedzi:

0

Obecnie jesteś związany z localhost który jest tylko interfejsem wewnętrznym. Programy, które się wiążą 127.0.0.1 nie są dostępne w sieci, jest to zgodne z projektem. Można to zobaczyć, gdy otrzymasz „połączenie odrzucone”, gdy łączysz się z zaporą w dół. Kiedy wyślesz TCP SYN do zamkniętego portu system operacyjny odeśle a TCP RST z powrotem do klienta, aby wskazać, że port jest zamknięty.

Kiedy mówisz wiążące 0.0.0.0 nie działa, czy możesz być bardziej szczegółowy? Jak to się nie udaje?

Jedna rzecz, którą możesz wypróbować, to:

server.bind(("", port))

Jeśli dobrze pamiętam, spróbuje powiązać wszystkie dostępne interfejsy. Nie jestem pewien, co próbowałeś wcześniej, ale powinno to rozwiązać Twój problem.

prateek61
źródło
Dziękuję za Twój wysiłek. Ale wydaje się, że mój komputer ma złożony problem. Przeprowadziłem wiele testów i odkryłem, że jest problem z moim komputerem. Problem jest prawdopodobnie w ustawieniach mojego komputera, ponieważ próbowałem wielu różnych podejść do tego, aby moje programy działały i nie rozwiązałem problemu, podczas gdy pominąłem możliwość, że cokolwiek innego jest problemem. Dowiedziałem się, że połączenie zostanie nawiązane, jeśli hostuję gniazdo serwera w moim telefonie. Problem występuje tylko w moim komputerze. Program działa poprawnie na moim laptopie.
Cosinux
Wierzę, że powiązanie z różnymi interfejsami nie zadziała. Próbowałem już 0.0.0.0, 127.0.0.1 i 192.168.1.4.
Cosinux
Każda próba spowoduje połączenie odrzucone błąd. Próbowałem też podłączyć telefon do komputera za pośrednictwem sieci komórkowej, ustawiając przekierowanie portów na mój komputer, ale to nie zadziałało.
Cosinux
Czy możesz udostępnić wyjście netstat na laptopie i komputerze z uruchomionym programem?
prateek61