Najpreprostejši protokol za sinhronizacijo ure prek interneta je rdate. Pri tem protokolu klient preprosto vpraša strežnik po času, strežnik pa mu čas vrne. Za uporabo rdate potrebujemo poseben program, imenovan rdate:

apt-get install rdate

Uro potem lahko nastavimo povsem preprosto:

rdate NEKSTREZNIK

kjer je NEKSTREZNIK lahko naprimer ntp1.arnes.si.

Nato se lahko začnemo igrati s časom. Za nastavljanje in gledanje časa v konzoli uporabite ukaz date:

date

Čas lahko nastavite z ukazom date -s.

Prva naloga: na poljuben način nastavite uro na včeraj ob polnoči.

Druga naloga: z rdate nastavite uro na pravi čas, pri čemer promet med strežnikom in vašim računalnikom zajemite z wiresharkom. Iz prometa odčitajte čas.

Tretja naloga: napišite program v poljubnem programskem jeziku, ki bo s pomočjo rdate dobil točen čas in ga izpisal na zaslon. To, na katera vrata se morate povezati, lahko odčitate v datoteki /etc/services. Kot strežnik spet lahko uporabite ntp1.arnes.si.

Primer odpiranja omrežne povezave v Pythonu:

#create an INET, STREAMing socket
s = socket.socket(
    socket.AF_INET, socket.SOCK_STREAM)
#now connect to the web server on port 80
# - the normal http port
s.connect(("www.mcmillan-inc.com", 80))

Primer odpiranja omrežne povezave v Javi:

Socket s = new Socket("nekstreznik.com", 666/* nekavrata */);
izhod = new OutputStreamWriter(s.getOutputStream());
vhod = s.getInputStream();

Primer, kako pošljemo neko sporočilo v pythonu:

s.send("sporocilo")

Pošiljanje v Javi:

izhod.write("sporocilo", 0, "sporocilo".length());

Primer, kako preberemo podatek dolžine 13 byte-ov s socketa. 13 byte-ov zato, da ni podobno ničemur drugemu. Številka, v kateri se po time protokolu sporoči čas, ima dolžino 4 byte:

podatek = s.recv(13)

V Javi:

byte podatek[] = new byte[13];
int dejanskoPrebranih = vhod.read(podatek);

Ali (malce bolj pravilno):

DataInputStream podatkovniVhod = new DataInputStream(vhod);
podatkovniVhod.readFully(podatek);

Kako v Javi preberemo 4 byte pretvorimo v številko:

byte podatek[] = new byte[4];
ByteBuffer buf = ByteBuffer.wrap(podatek);
int stevilka = buf.getInt();

Kako 4 byte v Javi preberemo in interpretiramo kot številko:

int stevilka = podatkovniVhod.readInt();

Kako pythonovski niz, ki vsebuje binarni zapis navadnega celega števila, pretvorimo v celo število, z uporabo paketa struct:

stevilka = struct.unpack("i", podatek)

Kako čas v sekundah od 1. 1. 1970 pretvorimo v datum v Pythonu:

time.localtime(stevilka)

Kako čas v milisekundah od 1. 1. 1970 pretvorimo v datum v Javi:

Date d = new Date(milisekunde);

Četrta naloga: namestite NTP strežnik. Preberite si, približno kako se NTP strežniki usklajujejo med sabo. Preberite si, kakšna je zgodovina NTP strežnikov pri nas in kakšni so problemi pri nastavljanju ure. Nastavite svoj NTP strežnik tako, da bo za višjenivojski strežnik uporabljal ntp1.arnes.si.

Zadnja sprememba: sreda, 10. avgust 2011, 10:21