Wysyłanie ramki protokołem udp

Wysyłanie ramki protokołem udp
UA
  • Rejestracja:ponad 15 lat
  • Ostatnio:5 miesięcy
0

Witam mam przesłać do urządzenia protokołem udp konkretną ramkę jak to zrobić. Znalazłem coś takiego https://www.cs.rutgers.edu/~pxk/417/notes/sockets/udp.html, ale tam wysyłany jest message w postaci tablicy znaków. Nie wiem jak wysłać ramkę z informacją bitową i informacją w kodzie ascii włącznie. Program będę pisał w języku c. Z góry dziękuję za pomoc.

Ramka miała by wyglądać np tak 11111101000000000000000000000000odpowied, taką mam specyfikacje ramki że najpierw liczba oznaczająca komendę a później sama komenda w znaku ascii

edytowany 1x, ostatnio: usm_auriga
several
  • Rejestracja:prawie 16 lat
  • Ostatnio:26 minut
0

...ale tam wysyłany jest message w postaci tablicy znaków. Nie wiem jak wysłać ramkę z informacją bitową...

Tak samo. Bity składają się w bajty, a bajty w reprezentacje znakowe. Np, jeśli potrzebujesz wysłać bity 1000001 to formujesz taką tablice:

Kopiuj
char tab[1] = {0x41}; // 1000001 ==  0x41
// albo
char tab2[1] = {'A'}; // 0x41 == 'A' w reprezentacji ASCII

I wysyłasz tak jak w przykładach z Twojego linku.


edytowany 1x, ostatnio: several
UA
  • Rejestracja:ponad 15 lat
  • Ostatnio:5 miesięcy
0

Źle ci powiedziałem, tam jest takie coś

Kopiuj
char *my_messsage = "this is a test message";

grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0

Witam mam przesłać do urządzenia protokołem udp konkretną ramkę jak to zrobić

To jest błędne rozumowanie już na samym początku, ponieważ to ramka, jednostka warstwy łącza danych, enkapsuluje informacje o protokołach warstw wyższych, a nie na odwrót. Nie da się ramki przesłać protokołem UDP. Da się natomiast opakować w ramkę dane przenoszone przez protokół UDP.

Poza tym ramki działają w oparciu o fizyczne adresy MAC, które zmieniają się per urządzenie, uczestniczące w przekazywaniu informacji. Na całym kanale komunikacji jest jeden adres IP destination i jeden adres IP source, które to spinają oba końce komunikacji ale zawsze jest N adresów MAC destination i MAC source, które to zmieniają się w każdym połączeniu peer to peer jeżeli urządzeń pośredniczących w komunikacji jest więcej niż tylko dwa spięte ze sobą kompy, patrz Internet.

edytowany 6x, ostatnio: grzesiek51114
several
  • Rejestracja:prawie 16 lat
  • Ostatnio:26 minut
1
usm_auriga napisał(a):

Źle ci powiedziałem, tam jest takie coś

Kopiuj
char *my_messsage = "this is a test message";

Podstawy C. Obydwa bufory, mimo różnego zapisu, mają niemal taką samą "mechanikę", a jeśli chodzi o przekazywanie ich wskaźnika do funkcji, to nie różnią się niczym

Kopiuj
int send(char *buf, int size);
int main() {
  send(my_message, strlen(my_message)); // OK
  send(tab, 1); // OK
  return 0;
}

Różnią się tym, że my_message jest null terminated dlatego możemy wykonać na niej strlen.

Jeżeli swój my_message zapiszesz w ten sposób:

Kopiuj
char my_messsage[23] = {'t', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 't', 'e', 's', 't', ' ', 'm', 'e', 's', 's', 'a', 'g', 'e', '\0'};

Będziesz mógł go używać tak samo, jak w oryginalnym zapisie.


edytowany 1x, ostatnio: several
nalik
  • Rejestracja:ponad 9 lat
  • Ostatnio:23 dni
  • Postów:1039
0
grzesiek51114 napisał(a):

Witam mam przesłać do urządzenia protokołem udp konkretną ramkę jak to zrobić

To jest błędne rozumowanie już na samym początku, ponieważ to ramka, jednostka warstwy łącza danych, enkapsuluje informacje o protokołach warstw wyższych, a nie na odwrót. Nie da się ramki przesłać protokołem UDP. Da się natomiast opakować w ramkę dane przenoszone przez protokół UDP.

Ależ nieprawda. Ramka to jest jakaś jednostka informacji. Ethernet używa terminu ramka, IP fragment, TCP i UDP używa terminologii segment, ale protokół użytkownika nad TCP/UDP może używać dowolnej terminologii. Przykładowo ZeroMQ w specyfikacji protokołu używa terminu ramek, które są zbudowane nad strumieniem TCP.

Na całym kanale komunikacji jest jeden adres IP destination i jeden adres IP source,

Tylko w uproszczonej sytuacji, bo przecież mamy tunelowanie, NAT, load balancery, virtual ip, brokery, forwarding i tak dalej.

edytowany 1x, ostatnio: nalik
grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0

ale protokół użytkownika nad TCP/UDP może używać dowolnej terminologii.

Porcję informacji z warstwy aplikacji, którą będę przesyłać siecią, a którą będę opakowywał w jednostki poszczególnych warstw OSI czy TCP/IP, mogę sobie nazwać jak chcę. Jeśli tak na to patrzymy to masz rację

Tylko w uproszczonej sytuacji, bo przecież mamy tunelowanie, NAT, load balancery, virtual ip, brokery, forwarding i tak dalej.

No tak ale specjalnie podałem naprostszy wariant.

edytowany 1x, ostatnio: grzesiek51114
nalik
  • Rejestracja:ponad 9 lat
  • Ostatnio:23 dni
  • Postów:1039
0
usm_auriga napisał(a):

Witam mam przesłać do urządzenia protokołem udp konkretną ramkę jak to zrobić. Znalazłem coś takiego https://www.cs.rutgers.edu/~pxk/417/notes/sockets/udp.html, ale tam wysyłany jest message w postaci tablicy znaków. Nie wiem jak wysłać ramkę z informacją bitową i informacją w kodzie ascii włącznie. Program będę pisał w języku c. Z góry dziękuję za pomoc.

Ramka miała by wyglądać np tak 11111101000000000000000000000000odpowied, taką mam specyfikacje ramki że najpierw liczba oznaczająca komendę a później sama komenda w znaku ascii

usm_auriga napisał(a):

Źle ci powiedziałem, tam jest takie coś

Kopiuj
char *my_messsage = "this is a test message";

Generalnie to wysyłasz n bajtów. Czy te bajty są ciągiem znakowym zakończonym NULL, czy reprezentacją struktury danych, to sprawa kodowania i interpretacji w aplikacji.

edytowany 2x, ostatnio: nalik
UA
  • Rejestracja:ponad 15 lat
  • Ostatnio:5 miesięcy
0

Dzięki to co powiedzieliście powinno wystarczyć do napisania tej komunikacji. Podstawy C to ja miałem ponad 5 lat temu i mi się zapomniało po prostu, że nazwa tablicy jest wskaźnikiem na pierwszy element.

edytowany 1x, ostatnio: usm_auriga

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.