kicaj Napisano Marzec 12, 2005 Zgłoszenie Share Napisano Marzec 12, 2005 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 More sharing options...
Rekomendowane odpowiedzi
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ę