Określenie długości nagłówka danych w przychodzącym pakiecie multicast

Określenie długości nagłówka danych w przychodzącym pakiecie multicast
PI
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:66
0

Witam

Czy udałoby się to zrealizować przy pomocy standardowych bibliotek Javy?

packet.getData() zwraca mi długość danych w zadeklarowanym buforze, czyli de facto długość całego zadeklarowanego bufora (dane + ewentualnie wypełnienie bufora zerami). Jak określić rzeczywistą długość nagłówka danych w danym przychodzącym pakiecie? W każdym pakiecie może być przecież inna.

Pozdrawiam

Antoniossss
  • Rejestracja:prawie 16 lat
  • Ostatnio:około 10 lat
0

Ale jaki nagłówek ty chcesz odczytać? Tcp? Udp? Arp? A może samego IP?
Skonkretyzuj się.
Z samej javy to możesz mieć najwyżej dostęp do warstwy aplikacji
PS. ale sądze, że skoro używasz pojęcia "pakiet" to chodzi Ci o UDP.
Nie ta warstwa - musisz sobie sam socket zaimplementować i wtedy będziesz mógł sobie czytać co chcesz i gdzie chcesz bajt po bajcie, tak jak to widzą urządzenia w sieci.


www.toptraker.pl
TopTraker! - I wiesz co jest grane!
Mój własny projekt w Javie - najnowsza wersja już jest!
edytowany 2x, ostatnio: Antoniossss
PI
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:66
0

Piszę o multicast. Więc to UDP. Nagłówek danych (payload). A metoda getData() to na czym działa jak nie na bajtach?

Antoniossss
  • Rejestracja:prawie 16 lat
  • Ostatnio:około 10 lat
0

Ale zrozum, że obsługa komunikacji sieciowej jest wykonywana warstwowo. Słyszałeś o modelu OSI ? Jak nie to googleIT!
W związku z powyższym, nie wszystko co widzisz w wiresharku wyciągniesz w swojej aplikacji. (Przynajmniej nie bez implementacji własnej obsługi niższych warstw)
Metoda getData nie działa na niczym, tylko zwraca jak już. A co zwraca? No właśnie "body" danych wysłanych a nie całą ramkę informacyjną.

Po co Ci długość samego nagłówka? (btw - bez sprawdzenia - nagłówki właśnie cą stałej długości...)
Czy tobie nie jest potrzebny rozmiar przesłanych danych (w jednym pakiecie) ?
Bo jeżeli tak, to taką informacje najlepiej umieścić w samym pakiecie np. przeznaczyć pierwsze 4 bajty na określenie ilości następujących bajtów które trzeba traktować jako dane. (Tworzy się w ten sposób jakby własny nagłówek - to tak jakby dołożyć warstwę w modelu;])

A co do ostatniego Twojego postu - payload to nie nagłówek danych tylko właśnie same dane - to co ja nazwałem "body" wyżej.

PS. a tak, faktycznie był multicast w temacie - tak pięknie napisanym temacie ze się na belce tematu nie mieści.


www.toptraker.pl
TopTraker! - I wiesz co jest grane!
Mój własny projekt w Javie - najnowsza wersja już jest!
edytowany 2x, ostatnio: Antoniossss
PI
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:66
0

Odnoszę wrażenie, że dyskusja zmierza w złym kierunku. Dlaczego z góry zakładasz pewne rzeczy i dyskredytujesz ludzi? Najpierw zapytaj potem bij. Komunikacja jeszcze nikomu nie zaszkodziła. Sam dobrze wiesz, że z terminologią bywa różnie. Sama wikipedia (https://pl.wikipedia.org/wiki/User_Datagram_Protocol) twierdzi, że pakiet UDP to nagłówek (header), a w nim są odpowiednie pola (i każdy enkapsulowany protokół to dodatkowy nagłówek). Z kolei we frameworkach spotkałem się już z trochę inną konwencją - każde pole to nagłówek. Owszem stosowanie konwencji wiadomo, że ułatwia życie - ale nikt jej nikomu nie narzuca. Czy zwracanie to również nie jest jakaś forma działania? Nie licytujmy się kolego, bo to bez sensu. Co do długości pola danych, to potrzebuję tylko takie przychodzące pakiety UDP o określonej długości tego pola danych - dajmy na to np. 6 bajtów. Nagłówki może i są stałej długości, ale też są takie które nie są wymagane (opcjonalne) i może i najzwyczajniej w świecie nie być w pakiecie (np. suma konrolna w UDP IPv4).

A co do getData() to metoda to zwraca wcześniej zadeklarowany bufor wypełniony właśnie polem danych z pakietu. Jeśli jednak pole danych będzie krótsze niż zadeklarowany bufor zostanie on dopełniony zerami. Oczywiście mógłbym zadeklarować długość bufora na taką wielkość jaką maja interesujące pola danych w pakietach, ale chciałbym znać jednak długość tego pola wcześniej. Wnioskuje jednak, że tego się nie da bez schodzenia na niższą warstwę modelu OSI.

PS. Mi się mieści (a na głównej liście wątków masz dymek/chmurkę z pełna treścią). Regulamin forum narzuca limit znaków w temacie? Moim zdaniem czepiasz się, albo się nudzisz. Przecież nie masz obowiązku uczestniczenia w dyskusjach na tym forum.

Antoniossss
  • Rejestracja:prawie 16 lat
  • Ostatnio:około 10 lat
1
Pienia napisał(a):

A co do getData() to metoda to zwraca wcześniej zadeklarowany bufor wypełniony właśnie polem danych z pakietu. Jeśli jednak pole danych będzie krótsze niż zadeklarowany bufor zostanie on dopełniony zerami. Oczywiście mógłbym zadeklarować długość bufora na taką wielkość jaką maja interesujące pola danych w pakietach, ale chciałbym znać jednak długość tego pola wcześniej. Wnioskuje jednak, że tego się nie da bez schodzenia na niższą warstwę modelu OSI.

PS. Mi się mieści (a na głównej liście wątków masz dymek/chmurkę z pełna treścią). Regulamin forum narzuca limit znaków w temacie? Moim zdaniem czepiasz się, albo się nudzisz. Przecież nie masz obowiązku uczestniczenia w dyskusjach na tym forum.

Tak masz racje, czepiam się :)
Nie nie nudzę się mam full zajęć :)

tak GetData zwraca bufor - referencje na niego

możesz odbierać tylko i wyłącznie kontent, nie odczytasz danych warstwy transportowej i sesji bezpośrednio korzystając z implementacji socketów zawartych w sdk. Poza tym, mam wrażenie, że chcesz na siłę zejść warstwę niżej zawijając to co jest wyżej - socket i tak ładuje dane w bufor np w przypadku strumieni, nigdy nie czytasz "bezpośrednio" z sieci a zawsze z bufora danych (nawet sprzętowego) - takie zachowanie jak w przypadku buforowanych strumieni (programowo oczywiście czyli np BufferedInputStream BufferedOutputStream)

Standardowo paczki UDP mają po 8 kb - nie ma co kombinować, tylko przyjąć taką konwencje. Nie wiem czemu chcesz przesyłać takie małe porcje danych.
Problem który Ty przedstawiasz, powinien się właśnie tyczyć dużych ilości danych na które trzeba przygotować n-kb buffor. Czy na serio byłby problem wykorzystywać do odbioru ciągle jeden bufor? Prawdę mówiąc (nie znam Twojego celu działania - nie wiem czemu tak chcesz coś zrobić nie inaczej) to zrobisz większy narzut na zasoby i czas pracy procesora w ten sposób rozwiązując transmisje, niż korzystając z jednego bufora - ale też nie wiem czy to jest Twoim celem.

EDIT. :
Przeczytałem jeszcze raz - rozumiem, chcesz wyciągać pakiety o określonej długości - swoisty filtr.
Nie nie zrobisz tego w sposób przedstawiany przez Ciebie - nie odczytasz bezpośrednio długości pakietu.
Musisz go zaciągnąć, sprawdzić co Ci potrzebne i dalej działać - albo tak jaj już trzeci raz napisze, obsłużyć niższą warstwę i doimplementować metdoę filtrującą do samej implementacji socketa


www.toptraker.pl
TopTraker! - I wiesz co jest grane!
Mój własny projekt w Javie - najnowsza wersja już jest!
edytowany 3x, ostatnio: Antoniossss
PI
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:66
0

Dzięki za odpowiedź. Filtrować faktycznie stricto nie mogę. Ale mogę określić bufor na 6 bajtów i sprawdzać co w nim jest w/g zadanych reguł. Jednak aplikacja, która wysyła te interesujące mnie pakiety puszcza je w seriach po 5 (duble, z wiadomych przyczyn w UDP mulitcast - jakiś pakiet raczej na pewno osiągnie cel). Problem jest z tymi dublami. Niekoniecznie muszą przyjść jeden po drugim. Może (nie musi) też przyjść za chwilę taka sama druga seria (ale raczej w pewnym odstępie czasowym 1/4 - 1/2 sekundy). Z każdej serii muszę wydłubać jeden pakiet - reszta jest mi zbędna. Z poziomu standardowych instrukcji Javy nie zbadam raczej w jakim odstępie czasowym przyszły pakiety. Pobranie 5 pakietów i odczekanie tego kawałka czasu to też chyba zły pomysł - nie ma gwarancji, że pakiety UDP w ogóle przyjdą i w danej kolejności, nie przemieszane z innymi pakietami z tego multicastu. Testowałem wrapper jNetPcap, ale tam w nieskończonej pętli loop miałem problemy z przepełnieniem pamięci.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)