Wysyłanie ramki protokołem udp

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

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:

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.

0

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

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

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.

1
usm_auriga napisał(a):

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

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

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:

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.

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.

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.

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ś

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.

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.

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