Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C#] Pakiety UDP i gniazdo

tro.ol 16 Lut 2010 18:55 4027 8
  • #1 16 Lut 2010 18:55
    tro.ol
    Poziom 11  

    Witam,
    piszę aplikacje do wysyłania i odbierania pakietów UDP w C#.

    Mam pytanie czy ta sama aplikacja może nadawać na PORT X (0..65535) i odbierać na PORT Y (0..65535), gdzie X <> Y ? Czy musi być jednak X=Y ?
    Czy potrzebne są dwie deklaracja gniazd Socket, czy można na jednym?

    0 8
  • #2 16 Lut 2010 22:30
    PanBo
    Poziom 16  

    Zwykle X <> Y. Gdyby musiał być taki sam, to po nawiązaniu z jednego IP dwóch połączeń do serwera na ten sam port serwer nie potrafiłby rozróżnić tych klientów.

    0
  • #3 17 Lut 2010 01:07
    tro.ol
    Poziom 11  

    Hmm, czyli aby np skontaktowac sie z kompem o adresie ip x.x.x.x, który wysyła dane (do mej lokalnej maszyny) na port 1234, a odbiera na 1235

    należało by stworzyć 2 gniazda?
    np
    UdpClient receivingUdpClient = new UdpClient(1234); // odebranie z x.x.x.x
    UdpClient sendingUdpClient = new UdpClient(1235); // nadawanie do x.x.x.x

    dobrze mowie?
    (I np stworzyc 2 wątki do obsługi ich?)

    0
  • #4 17 Lut 2010 09:09
    PanBo
    Poziom 16  

    Nie jestem pewny czy myślimy o tym samym, ale jeśli komp na ip x.x.x.x jest serwerem i nasłuchuje na porcie 1235, to po stronie klienta tworzysz gniazdko z lokalnym portem 1234 (Bind) a zdalnym 1235 (Connect). Komunikacja przez niego będzie działać w obie strony. Z tym że tak jak wcześniej pisałem, po stronie klienta nie ma potrzeby definiowania portu lokalnego (bindowania) bo system operacyjny automatycznie przydzieli wolny port do tego socketa.

    0
  • #5 17 Lut 2010 22:30
    adamz74
    Poziom 30  

    Wszystko zależy od tego co chcesz zrobić i co chcesz osiągnąć.

    1.
    Najbardziej typowym i najczęściej występującym rozwiązaniem jest komunikacja klient-serwer. Komunikację zawsze zaczyna Klient z losowego wolnego portu większego od 1024 (jakoś tam sobie wybierany przez jakiś algorytm, nie jest to istotne) i łączy się na ściśle określony (przez twórce aplikacji) port Serwera. Serwer odpowiada (dla UDP nie musi) ze swojego ściśle określonego portu na port z jakiego przyszła komunikacja od Klienta.

    Różnica polega na sposobie otwierania socket-ów.
    Po stronie Klienta socket jest otwierany tylko na czas danej sesji komunikacji i dla każdej sesji komunikacji jest tworzony odrębny (bardzo ładnie to widać podczas otwierania dowolnej strony www w przeglądarce).
    Po stronie Serwera jest to jeden socket (tzw. bindowany) dla wszystkich połączeń kierowanych na dany port. Jest on utworzony z reguły raz na cały czas pracy danego programu serwerowego (tzn. Serwer zawsze nasłuchuje na danym porcie).

    2.
    W szczególnych przypadkach, tj gdy rodzaj aplikacji i rodzaj komunikacji wyklucza możliwość otwierania wielu sesji komunikacyjnych pomiędzy dwoma adresami IP, można "zbindować" porty po obu stronach i w takim przypadku porty (źródłowy i docelowy) będą ściśle określone oraz najczęściej równe sobie. Nie ma już losowego wybierania portu po stronie Klienta.
    Takie rozwiązanie można spotkać np. w oprogramowaniu do tworzenia sieci VPN.

    Pozdr!

    0
  • #6 17 Lut 2010 22:53
    PanBo
    Poziom 16  

    Do punktu pierwszego jest jeszcze jeden niuans. W przypadku połączeń TCP po stronie serwera faktycznie na początku jest otwarty tylko 1 socket - ten który przez cały czas nasłuchuje na nowe połączenia na stałym porcie. Ale gdy już jakieś połączenie zostanie nawiązane tworzony jest nowy socket na wysokim porcie i to on przejmuje odpowiedzialność za komunikację z tym konkretnym klientem. A pierwszy socket dalej czeka na nowych klientów.

    0
  • #7 17 Lut 2010 23:27
    adamz74
    Poziom 30  

    PanBo pragnę się z Tobą nie zgodzić. Portem źródłowym komunikacji powrotnej z Serwera jest port na którym nasłuchuje Serwer, czyli, np.: dla Serwera WWW:

    zakładamy, niech:
    Klient: ma adres np. 192.168.1.1 i wylosował sobie port np: 1200.
    Serwer: ma adres np. 10.1.1.1 i nasłuchuje na porcie 80 (WWW).

    Zapytanie do serwera (Klient -> Serwer) będzie wyglądało:
    192.168.1.1:1200 -> 10.1.1.1:80

    Odpowiedź serwera (Serwer -> Klient), to:
    10.1.1.1:80 -> 192.168.1.1:1200

    Serwer nie może odpowiadać z wysokiego portu, bo Klient tego nie zrozumie.

    PS. Być może pomyślałeś o FTP, gdzie faktycznie na potrzeby kanału DATA są tworzone dodatkowe socket-y i połączenie, ale to jest specyfika tego protokołu.

    0
  • #8 17 Lut 2010 23:51
    PanBo
    Poziom 16  

    Fakt, mój błąd. Nowe sockety tworzone dla każdego odebranego połączenia mają ten sam lokalny port na który przyszło połączenie.

    0
  • #9 19 Lut 2010 08:53
    BRASS
    Poziom 15  

    Dla ścisłości mówimy:

    ramka etherneru,
    pakiet(czasem tez datagram) ip
    segment tcp/udp

    0