Udostępnianie usług w sieci LAN

0

Witam, szukam sposobu na zorganizowanie w sieci LAN protokołu komunikacji typu Serwer Klient, z tym, że chciałbym móc wykryć wszystkie dostępne serwery danej usługi w miare szybkim czasie (1-10 sekund). Czy jest to możliwe? Jakiej technologii użyć? Sondowanie na wątkach każdego możliwego IP chyba nie będzie wydajne? Czy wręcz przeciwnie?

0

Czyli mam użyć UDP Broadcast? Czy są jakieś zasady niepisane odnośnie użytego portu UDP? Obojętnie jaki sobie wybiore? Czy może ten pokrywający sie z TCP?

0

Z Twojej wypowiedzi wnioskuję, że nie do końca wiesz jaka jest różnica między TCP a UDP więc rzuć okiem na ten link: http://www.diffen.com/difference/TCP_vs_UDP
Jak już zrozumiesz na czym polega różnica to sam sobie odpowiesz na to pytanie.

0

Ciężko mi to ogarnąć. Dodałem na Formularz IdUDPServer, a następnie w bindings działa mi tylko 0.0.0.0:777 dla przykładu. Po localhost to działa, natomiast jeśli z innej maszyny robie broadcast to serwer milczy.

z tego co wyczytałem na binding powinienem dać coś w rodzaju 255.255.255.255 lub 192.168.0.255 żeby słuchać innych komputerów, ale przy próbie Active=True dostaje błąd: Cannot Assign requested address bez względu na wpisany port.

1

No dobra to najpierw trochę opisu. TCP działa na zasadzie klient=server (analogia to rozmowa telefoniczna wykręcasz numer i dzwonisz do kolegi). Klient poprzez IP oraz numer portu łączy się do serwera, następnie komunikacja między klientem a serwerem odbywa się jeden do jeden (podobnie jak podczas rozmowy telefonicznej). Klient pyta, serwer odpytuje lub na odwrót serwer coś robi i do podłączonego klienta/klientów wysyła informacje (gdyż do jednego serwera może być podłączone x klientów). Bardziej szczegółowo transmisja odbywa się za zasadzie potwierdzenia odbioru czyli jeśli jedna strona wysyła ramkę danych to druga w odpowiedzi na tą ramkę wysyła potwierdzenie, do tego są sumy kontrolne itp - póki co Cię to nie obchodzić. Jeśli potwierdzenie nie nadchodzi to dana strona może próbować ponowić wysłanie, aż osiągnie pewien timeout i przerwie nadawanie (najczęściej z komunikatem błędu) - to tak jakby podczas rozmowy telefonicznej przerwało lub nie miałbyś pewności czy druga strona jeszcze tam jest to pytasz: "Halo jesteś tam jeszcze?" i powtarzasz komunikat - tym też nie musisz się przejmować bo w Delphi komponenty do TCP załatwiają to za ciebie.

UDP natomiast działa na zasadzie rozgłośni radiowej czyli: Serwer nadający na UDP na konkretnym porcie może być rozlokowany "gdzieś" w sieci tak jak stacja radiowa jest położona gdzieś w zasięgu twojego odbiornika radiowego (np radia w samochodzie). Serwer (podobnie jak radiostacja) nadając na konkretnym porcie wysyła informacje i ma "gdzieś" czy ktoś tą informację odsłucha czy nie. Klient natomiast (podobnie jak radio) nasłuchuje na konkretnym porcie (podobnie jak radio na konkretnej częstotliwości) i jeśli jakaś informacja na tym porcie do klienta dotrze to git jak nie ... to znaczy, że nadawanie na sieci gdzieś "przepadło" - czasem się to zdarza, przy kiepskiej architekturze sieci.

Biorąc pod uwagę powyższy opis powiedz mi co potrzebujesz nadać sygnał aby wszyscy klienci mogli go odebrać czy podłączyć się do wszystkich serwerów jednym klientem?

0

zamierzam stworzyć w obrębie sieci LAN kilka serwerów (które będą nasłuchiwały TCP na dowolnie skonfigurowanym porcie), chciałbym móc szybko zeskanować całą sieć tak żeby mieć liste komputerów na których moja usługa TCP działa.

Pomyślałem więc, że na każdym z takich serwerów TCP osobno uruchomie też serwer UDP na stałym porcie. Następnie gdy będe chciał zeskanować całą sieć, to zrobie na UDP broadcast, a serwery UDP odpowiedzą, i w rezultacie będę mieć liste adresów IP w kilka sekund. To taki mój mały zamysł.

Po przeczytaniu twojej odpowiedzi jestem troche zmieszany, bo myślałem, że to IdUDPClient robi broadcast gdzie popadnie, a server nasłuchuje i triggeruje Event onUDPRead. Czy może to bez znaczenia?

0

Po co osobny serwer UDP stawiać, kiedy możesz zrobić broadcast TCP. Musisz "jedynie" rozumieć, co robisz, a nie strzelać na oślep.

Teraz to i ja strzeliłem na oślep. W TCP nie ma broadcastów.
Dla TCP pozostaje wykryć w jak dużej sieci się jest, jeśli jest klasy D do C to jest mniej niż 64k hostów. Stukanie wielowątkowo do konkretnego portu z krótkim timeoutem to kilkadziesiąt+ sekund. Sporawo, ale im więcej wątków naraz i im mniejsza sieć tym bardziej można się zbliżyć do akceptowalnych kilku sekund.
Trochę dużo założeń, czyli najprościej i najskuteczniej będzie jednak użyć UDP.

1

broadcast TCP? Może i nie wiem wszystkiego, ale to chyba kiepski pomysł.

1 użytkowników online, w tym zalogowanych: 0, gości: 1