Witam. Potrzebuje pomocy, piszę prosty program typu klient - serwer. Jednak nie bardzo wiem jak mam ustawić klienta żeby wysłał pakiet na każdy adres IP, ponieważ założenie jest takie że znam tylko port na którym pracuje serwer, IP jest w kliencie nieznane. Jakieś rady?
Prawdopodobnie muszę w jakiś specjalny sposób ustawić
saddr.sin_addr = ???
jak nie znasz adresu serwera, to jak chcesz wysyłać cokolwiek?
chcesz wysyłać na każdy możliwy adres ip? proszę bardzo:
for(int i=0; i<0xFFFFFFFF; ++i)
{
sin_addr = i;
}
powodzenia :D
@camillos nie żartuj sobie... zainteresuj się czymś takim jak komunikacja multicastowa ;)
Działa to tak ze serwer moze "zarejestrować się" że chce dostawać wszystkie multicasty wysyłane na adres X (z klasy multicastowej) i wtedy klienci mogą spokojnie na ten adres wysyłać nie wiedząc jaki adres ma serwer.
Uruchamiam pogram i on w sieci odnajduje i łączy sie ze swoimi kopiami na innych komputerach przy użyciu UDP. Nie zrobię tego inaczej niż komunikacją multicastową?
Bez szans. Co więcej, skąd pomysł ze te komputery w ogóle maja publiczne IP? Multicast jest tutaj idealną opcją.
UWAGA! Pakiety multicastowe nie przechodzą przez większość ruterów! To jest rozwiązanie dla zamkniętych sieci (LAN, WAN, MAN).
Jeśli serwer może być na dowolnej maszynie w sieci lokalnej, to stosuje się różne mechanizmy:
- Aktualizacja DNS - serwer ma znaną nazwę i rejestruje się do systemu, który odpowiednio aktualizuje rekord w lokalnym serwerze DNS. Klienta łączą się po nazwie. Ten mechanizm wykorzystują np. niektóre usługi Microsoft, czy dynDNS.
- Rozgłaszanie pytania - klienta wysyłają broadcast z pytaniem o serwer. Jeśli jest on obecny w sieci, odpowiada na nie i na tej podstawie klient określa adres IP serwera. Mechanizm stosowany jest np. w Microsoft Networking.
- Pośrednik sieciowy - w sieci znajduje się jedna maszyna, która pośredniczy w wymianie danych między klientami i serwerem. Obie strony podłączają się do pośrednika, który ma stały i znany adres.
- Rozgłaszanie multicast - mniej więcej to samo co broadcast, tyle że używane są pakiety multicastowe zamiast unicastowych. Mechanizm stosowany np. w DNS-SD.
Znajdowanie serwera poprzez rozgłaszanie oraz aktualizację DNS wymaga wprowadzenia dodatkowych zabezpieczeń, gdyż w bardzo prosty sposób można się podszyć pod serwer. W tym pierwszym sposobie wystarczy odpowiedzieć szybciej niż właściwy serwer (wcześniej dodatkowo go [D]DoSując jeśli konieczne), w tym drugim - zarejestrować się jako serwer. Rozgłaszanie broadcast i multicast jest odpowiednie jedynie w przypadku, gdy w danej sieci może się znajdować kilka maszyn serwujących takie same, lub podobne zasoby (np. drukarki, strumienie audio/wideo itp), które nie są krytyczne dla bezpieczeństwa. Jeśli w sieci jest tylko jeden serwer, powinien mieć on stały i znany adres IP lub nazwę, której nie można zaktualizować automatycznie w DNSie (nawet przez DHCP).
Pytania takie jak powyżej najczęściej dotyczą maszyn podpiętych do jakiejś Neostrady, ze zmiennym IP. W takich przypadkach najlepiej jest skorzystać z usługi typu dynDNS.
Ja się na tym za bardzo nie znam ale w swojej grze robie tak że na serwerze www mam aplikacje php. Serwer gry na zmienym ip , przy uruchomieniu wysyła do aplikacji php info o swoim ip i nazwie, tam skrypt zapisuje to w pamięci. Serwer www ma stały ip. Gra przy starcie wchodzi na serwer www i sprawdza na jakim ip jest jaki serwer i po wyborze serwera uruchamia połonczenie z serwerem. Aplikacje php napisał mi kolega więc się nie pytaj co i jak bo niewięm jak to napisać.
Pytanie uściślające do autora tego wątku: czy to ma być w sieci lokalnej czy w caaaałym internecie?