2013-04-12 15 views
5

Piszę na aplikacji serwer/klient UDP.Wiązanie 40 gniazd do 40 różnych adresów IP

Chcę, aby mój jeden serwer obsługiwał 40 klientów jednocześnie. W tym celu chcę utworzyć 40 dedykowanych wątków, z których każdy przeznaczony jest dla jednego klienta. Ponieważ istnieje 40 wątków po jednym dla każdego klienta, chcę również utworzyć 40 dedykowanych gniazd.

Ale problem, że:

Nie wiem, co będzie 40 adresów IP, do którego będę bind() My gniazd. (ponieważ do tej pory musiałem powiązać() z moim adresem IP serwera.) Normalnie wiążę() z "INADDR_ANY", gdy istnieje tylko jedno gniazdo.

Ale jakie powinny być adresy IP, na których powinienem się połączyć() z każdym z 40 gniazd? Proszę, pomóż mi. Każdy komentarz/pomoc jest doceniana.

+0

Potrzebujesz 40 gniazd (adresów gniazd) lub 40 adresów IP? Czy twój gospodarz ma tak wielu? –

Odpowiedz

2

Jeden wspólny sposób to zrobić z UDP jest:

  • serwera bind() do znanego portu.
  • Klient wysyła początkowy pakiet do tego dobrze znanego portu
  • Serwer odbiera pierwszy pakiet od klienta na dobrze znanym porcie.
  • Serwer tworzy nowe gniazdo z losowym portem
  • Serwer odpowiada na klienta z tego nowego gniazda.
  • Klient otrzymuje odpowiedź, zauważa, że ​​pochodzi z innego portu niż znany port serwera i używa tego portu jako miejsca docelowego do dalszej komunikacji.

Będziesz używał funkcji getpeername(), aby poznać adres zdalny.

Należy pamiętać, że protokół UDP nie wymaga połączenia, dlatego należy zasygnalizować koniec lub limit czasu dla gniazd.

1

Najczęściej używane połączenia to bind. Każde połączenie zostanie przypisane do unikalnego gniazda przez akceptację.

Podczas korzystania z protokołu UDP, po prostu używałbym protokołu TCP, jak opisano powyżej, aby poinformować klientów o ich adresach UDP serwera.

+1

accept() jest dla tcp podczas pracy nad UDP. – Ayse

+0

Jest to wymóg mojego systemu do stworzenia 40 gniazd. Problem polega na tym, że nie wiem, jakie adresy IP muszą być powiązane() z tymi 40 gniazdami :( – Ayse

+0

@Ayesha Hassen: Rozszerzyłem moją odpowiedź na adres UDP. –

2

bind potrzebuje tylko adresu lokalnego, a nie zdalnego.

Jeśli chcesz jedno gniazdo dla każdego klienta, musisz użyć różnych portów dla każdego (przy użyciu bind). W ten sposób każdy klient może wysłać swój ruch do dedykowanego portu, a Ty możesz mieć wątek dla każdego gniazda/portu.

Prawdopodobnie lepszym pomysłem jest posiadanie tylko jednego gniazda (i jednego portu) i posiadanie logiki w kodzie, aby przypisać ruch do wątku na podstawie adresu zdalnego (pobranego przy użyciu np. recvfrom).

+0

Jeśli istnieje tylko jeden wątek i wszystkie 40 klientów wysyła dane jednocześnie na tym pojedynczym gnieździe, są szanse, że dane każdego klienta mogą zostać porzucone Z tego powodu przeniosłem się do tworzenia dedykowanych gniazd dla każdego klienta – Ayse

+1

Jeśli naprawdę chcesz dedykowane gniazda, wyjaśniłem, jak Nie rozumiem, dlaczego uważasz, że dane zostałyby utracone, jeśli używasz tylko jednego gniazda. –

+0

Dziękuję za twoją pomoc :) bardzo mi pomogła :) Jedną z rzeczy, którą chcę wiedzieć, jest to, wady, jeśli utworzę 40 wątków/gniazd zamiast jednego wątku odsłuchu. każdy wydaje się być przeciwny tej idei. Czy są jakieś solidne powody? Dlaczego nie należy tworzyć 40 dedykowanych wątków/gniazd dla każdego klienta i skupić się na tworzeniu jednego gniazda? :( – Ayse

1

Utwórz pojedyncze gniazdo nasłuchu w dedykowanym wątku odsłuchowym.

Po otrzymaniu nowego pakietu należy użyć zdalnego adresu/portu pakietu lub umieścić unikalny identyfikator klienta w pakiecie, aby jednoznacznie zidentyfikować klienta.

Utwórz nowy wątek dla tego klienta, jeśli jeszcze nie istnieje, przeprowadź pakiet do tego wątku w celu dalszego przetwarzania i wróć do słuchania.

Jeśli dany wątek klienta nie otrzymuje żadnych pakietów przez jakiś czas, może się zakończyć.

Powiązane problemy