Skocz do zawartości

Potrzebny Kod Programu...


kicaj

Rekomendowane odpowiedzi

Bardzo mi potrzebny kod programu, który wyśle datagram UDP do jakiegoś serwera czasu ( może być local host ) a ten serwer prześle aktualny czas do komputera kótrego adres IP był w datagramie UDP wysłanym do serwera. Serwer odpowie również datagramem UDP.

 

Serwer czasu zdajie się, że działa na porcie 13.

 

Obrazowo to wygląda tak:

 

komp1 ----------------------------------------> serwer czasu ---------------------------------------> komp2

( prześlij do komp2 aktualny czas) (przesyłam do komp2 aktualny czas)

 

... i tu komp2 wyświetli aktualny czas.

 

 

Dla uproszczenia komp1, serwer i komp2 to może być jeden komputer.

 

Wiem że trzeba tworzyć całą ramkę (wartswa fizyczna, IP, UDP), ale na tym aż tak mi nie zależy.

Bardziej mnie intersuje jak obsłużyć funkcję wysyłającę ramkę i odbierającą (sendto i receive).

Ja narazie napisałem coś takiego :

 

---------

#include <stdio.h>

#include <linux/if_ether.h>

#include <sys/socket.h>

#include "print-ip.c"

 

#define BUFOR_LEN 1500

struct sockaddr adrr = {

AF_INET,

"eth0"};

 

 

unsigned short frame[200] = {

 

//ETHERNET

0x00, 0x60, 0x4C, 0x44, 0x6D, 0x36, // destination MAC

0x00, 0x60, 0x4C, 0x44, 0x6D, 0x36, // source MAC

0x08, 0x00, // type protocol (IP)

 

//IP

// version 4b, IHL 4b

0x45, // 4=0100, 5=0101 -> 01000101=0x45

0x00, // TOS

0x14, // total length 20=0x14

0x00, // identyfication

0x00, 0x00, // flags 3b, fragment offset 13

0xff, // TTL

0x11, // type protocol (UDP)

0x00, 0x00, // checksum

127, 0, 0, 0, // source IP

127, 0, 0, 0, // destination IP

 

//UDP

0xff, 0xff, // source port 16b

0x00, 0x13, // destination port 16b

0x00, 0x08, // UDP length + UDP data

0x00, 0x00 // checksum

};

 

 

int main()

{

unsigned short headerIP[20] = {

0x45, // 4=0100, 5=0101 -> 01000101=0x45

0x00, // TOS

0x14, // total length 20=0x14

0x00, // identyfication

0x00, 0x00, // flags 3b, fragment offset 13

0xff, // TTL

0x11, // type protocol (UDP)

0x00, 0x00, // checksum

127, 0, 0, 0, // source IP

127, 0, 0, 0 // destination IP

};

 

unsigned short checkSumHeaderIP = in_cksum(headerIP);

 

unsigned short headerUDP[8] = {

0xff, 0xff, // source port 16b

0x00, 0x13, // destination port 16b

0x00, 0x08, // UDP length + UDP data

0x00, 0x00 // checksum

};

 

unsigned short checkSumHeaderDataUDP = in_cksum(headerUDP);

 

memcpy ( &frame[22], &checkSumHeaderIP, 2);

memcpy ( &frame[40], &checkSumHeaderDataUDP, 2);

 

int s = socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL));

 

ssize_t bytesSend;

 

bytesSend = sendto (s, frame, sizeof(unsigned char)*200,0,(struct sockaddr *) &adrr, sizeof(adrr));

printf("%d",bytesSend);

 

return 0;

}

 

--------

 

Ale niestety funkcje sendto zwraca -1 czyli coś jest nie tak.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...