Próbuję bawić się komunikacją między procesami, a ponieważ nie mogłem wymyślić, jak używać nazwanych potoków w systemie Windows, pomyślałem, że użyję gniazd sieciowych. Wszystko dzieje się lokalnie. Serwer może uruchamiać slave'ów w oddzielnym procesie i nasłuchiwać na jakimś porcie. Niewolnicy wykonują swoją pracę i przekazują wynik mistrzowi. Jak sprawdzić, który port jest dostępny? Zakładam, że nie mogę nasłuchiwać na porcie 80 lub 21?
Używam Pythona, jeśli to ogranicza wybór.
Dzięki!
Odpowiedzi:
Nie łącz się z określonym portem ani nie łącz z portem 0, np
sock.bind(('', 0))
. System operacyjny wybierze wtedy dostępny port. Możesz pobrać wybrany portsock.getsockname()[1]
i przekazać go niewolnikom, aby mogli się z powrotem połączyć.źródło
sock.bind(('',0))
Ze względu na fragment tego, co chłopaki wyjaśnili powyżej:
źródło
s.bind(('localhost', 0))
jest lepiejs.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
socket.SO_REUSEADDR
naprawdę pomaga w tym przypadku? Z tego, co przeczytałem, istotne jest tylko to, że gniazdo, które próbuje się połączyć, maSO_REUSEADDR
i nie ma znaczenia, czy ta flaga jest ustawiona na przedłużającym się gnieździe.Powiąż gniazdo z portem 0. Zostanie wybrany losowy wolny port od 1024 do 65535. Możesz pobrać wybrany port
getsockname()
zaraz pobind()
.źródło
Możesz słuchać na dowolnym porcie; generalnie aplikacje użytkownika powinny nasłuchiwać na portach 1024 i nowszych (do 65535). Najważniejszą rzeczą, jeśli masz zmienną liczbę słuchaczy, jest przydzielenie zakresu do aplikacji - powiedzmy 20000-21000 i CATCH EXCEPTIONS . Dzięki temu dowiesz się, czy port nie nadaje się do użytku (innymi słowy jest używany przez inny proces) na Twoim komputerze.
Jednak w twoim przypadku nie powinieneś mieć problemu z używaniem pojedynczego portu zakodowanego na stałe dla twojego słuchacza, o ile drukujesz komunikat o błędzie, jeśli wiązanie się nie powiedzie.
Zauważ również, że większość twoich gniazd (dla slaveów) nie musi być jawnie powiązana z określonymi numerami portów - tylko gniazda, które czekają na połączenia przychodzące (takie jak twój master tutaj) będą musiały zostać ustawione jako nasłuchujące i powiązane z portem. Jeśli port nie zostanie określony dla gniazda przed jego użyciem, system operacyjny przypisze użyteczny port do gniazda. Kiedy master chce odpowiedzieć slave'owi, który przesyła mu dane, adres nadawcy jest dostępny, gdy słuchacz otrzyma dane.
Zakładam, że będziesz używać do tego UDP?
źródło
Jeśli potrzebujesz tylko znaleźć wolny port do późniejszego wykorzystania, oto fragment podobny do poprzedniej odpowiedzi , ale krótszy, przy użyciu serwera gniazd :
Pamiętaj, że nie gwarantuje się, że port pozostanie wolny, więc może być konieczne umieszczenie tego fragmentu kodu i używającego go kodu w pętli.
źródło