Wytłumaczenie kodu - prośba

Odpowiedz Nowy wątek
2020-01-14 12:52
0

Witam Was,

miałbym do Was prośbę, mianowicie czy ktoś z forumowiczów mógłby mi wytłumaczyć (tak dla laika - łopatologicznie) jakie procesy zachodzą w każdej linijce niżej zamieszczonego kodu.

while (true)
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPAddress serverAddr = IPAddress.Parse("adres IP");
IPEndPoint endPoint = new IPEndPoint(serverAddr, 11000);
string text = "Hello";
byte[] send_buffer = Encoding.ASCII.GetBytes(text);
sock.SendTo(send_buffer, endPoint);
}

Z góry wielkie dzięki i pozdrawiam.

edytowany 1x, ostatnio: cerrato, 2020-01-14 12:55

Pozostało 580 znaków

2020-01-14 13:06
while (true)
{ ...}

Pętla while wykonuje się tak długo, jak warunek podany w nawiasie będzie prawdziwy. Można dać wyrażenie w stylu while (zmienna > 90) i wtedy pętla będzie się wykonywać w kółko tak długo, aż zmienna będzie większa od 90. Ponieważ u Ciebie warunkiem jest TRUE, więc ten warunek będzie zawsze prawdziwy, a co za tym idzie - pętla będzie się kręcić w nieskończoność.

Jeszcze takie wyjaśnienie, bo nie wiem, czy wiesz, co to jest pętla. Pętle służą do powtarzania danej sekwencji poleceń, czyli w typ wypadku wszystko między { i } będzie powtarzane.

Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

Tutaj tworzymy sobie socket, czyli obiekt, który wykorzystamy do komunikacji przez sieć. Komunikacja będzie wykonana w oparciu o protokół UDP.

IPAddress serverAddr = IPAddress.Parse("adres IP");
IPEndPoint endPoint = new IPEndPoint(serverAddr, 11000);

Tutaj określasz parametry połączenia, czyli wskazujesz adres IP oraz port, na którym ta komunikacja ma się odbywać.

string text = "Hello";

Tworzysz zmienną tekstową, której przypisujesz wartość Hello - ta treść będzie później wysyłana przez stworzone wcześniej połączenie sieciowe

byte[] send_buffer = Encoding.ASCII.GetBytes(text);
sock.SendTo(send_buffer, endPoint);

Tutaj następuje właściwe przesłanie treści - najpierw deklarujesz tablicę i zapełniasz ją wartością pobraną ze zmiennej text, a następnie wysyłasz tą treść przez sieć.

Specjalistą od C# ani socketów nie jestem, więc proszę innych o sprostowanie, jeśli piszę głupoty, ale widzę tutaj potencjalny wyciek pamięci. Za każdym przebiegiem pętli jest tworzony nowy obiekt Socket sock = new Socket, ale nie widzę jego zwalniania. Czy tak powinno być (i np. socket jest automatycznie niszczony po zakończeniu transmisji/wysłaniu danych), czy tworzymy ich nieskończoną ilość i robimy przez to niezły bałagan? Poza tym, jak słusznie zauważył @Tomek Pycia, w pewnym momencie system stwierdzi, że więcej socketów nam już nie przydzieli, bo nie chce/nie może.


Naczelny forumowy hejter Apple

That game of life is hard to play, I'm gonna lose it anyway
The losing card I'll someday lay, So this is all I have to say
edytowany 2x, ostatnio: cerrato, 2020-01-14 14:48
Tu jest dokumentacja jak korzystać z Socetów https://docs.microsoft.com/pl[...].socket?view=netframework-4.8 . Dobrym nawykiem jest używanie using w celu zwolnienia wszystkiego trzeba po skonczomnej roboicie (https://docs.microsoft.com/pl[...]ence/keywords/using-statement) - Tomek Pycia 2020-01-14 13:29
@Tomek Pycia: zajrzałem w podany przez Ciebie link i znalazłem tam Po zakończeniu wysyłania i otrzymywania danych Użyj metody Shutdown, aby wyłączyć Socket. Po wywołaniu ShutdownWywołaj metodę Close, aby zwolnić wszystkie zasoby skojarzone z Socket. - czy dobrze rozumiem, że miałem rację i w podanym przykładzie mamy wyciek? - cerrato 2020-01-14 13:33
Na pewno mamy otwartego Soceta - pewnie wyciek też. Ale jak nie będziemy zamykać Socetów to w końcu system nam powie, że więcej nam ich nie otworzy. - Tomek Pycia 2020-01-14 13:35
No tak czy siak - nie jest to w takim razie napisane poprawnie. Racja? - cerrato 2020-01-14 13:36
Tak, należy posprzątać po sobie, jak sie otwiera Soceta, plik albo połączenie do bazy itp. - Tomek Pycia 2020-01-14 13:38
Nie ma wycieku pamięci, przecież to krótko żyjąca zmienna lokalna nie referencjonowana nigdzie poza metodą, więc GC "w którymś momencie" posprząta ją. Co najwyżej można powiedzieć o pewnym wycieku zasobów, bo będą zwalniane z takim opóźnieniem, z jakim GC będzie sprzątać, czyli gdzieś od natychmiast do "ojej, mam problem, bo gniazda się skończyły". - ŁF 2020-01-14 13:40

Pozostało 580 znaków

2020-01-14 14:43
0

Dziękuję bardzo za konkretną i szybką odpowiedź. Tyle mi wystarczy :) Jeszcze raz dzięki i pozdrawiam.

Pokaż pozostałe 4 komentarze
Ten, kto powinien. Wszystko pod kontrolą, nie stresuj się ;) - cerrato 2020-01-14 15:28
@cerrato: oficjalnie żebrze o łapki - PerlMonk 2020-01-14 15:38
nie myl żebrania (czyli dostawania czegoś za nic, z litości) z uczciwym wynagrodzeniem włożonego wysiłki oraz poświęconej uwagi. To tak, jakbyś powiedział, że pracownik żebrze o wypłatę :P - cerrato 2020-01-14 15:42
@cerrato: traktujesz pomaganie jako pracę? Ja całkowicie nie widzę problemu w pomocy komuś i nie dostaniu absolutnie nic za to. Nie pomagam dla profitów, tym bardziej dla tak mało znaczących jak łapka na jakieś stronce. - west 2020-01-15 15:03
@west: nie bierz wszystkiego tak na serio ;) - cerrato 2020-01-15 15:06

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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