socket programiranje

36
Korištenje Internet soket-a Autor: Brian "Beej" Hall [email protected] Copyright © 1995-2001 by Brian "Beej" Hall Prevodilac sa engleskog na srpski jezik: Maksimović Darko, [email protected] 04. Maj, 2003. godine, Bijeljina, Republika Srpska. Word file : Koljenovic Malik, [email protected] Visoko, BiH - 2004 Preuredio: Dzenan Sirco – [GARNeT] [email protected] WWW.NHC-Team.ORG Visoko, BIH - 2004 Copyright © 1995-2001 by Brian "Beej" Hall WWW.NHC-Team.ORG Str. 1

Upload: mxaleski

Post on 21-Jul-2015

141 views

Category:

Documents


4 download

TRANSCRIPT

Koritenje Internet soket-aAutor:

Brian "Beej" [email protected] Copyright 1995-2001 by Brian "Beej" Hall Prevodilac sa engleskog na srpski jezik: Maksimovi Darko, [email protected] 04. Maj, 2003. godine, Bijeljina, Republika Srpska. Word file : Koljenovic Malik, [email protected] Visoko, BiH - 2004 Preuredio: Dzenan Sirco [GARNeT] [email protected] WWW.NHC-Team.ORG Visoko, BIH - 2004

Copyright 1995-2001 by Brian "Beej" Hall WWW.NHC-Team.ORG Str.

1

1. Uvod

2. 3. 4.

5.

6.

7.

8. 9.

1.1. Sasluanje 1.2. Platforma i kompajler 1.3. Zvanina glavna strana 1.4. Primjedba za Solaris/SunOS programere 1.5. Primjedba za Windows programere 1.6. U vezi elektronske pote 1.7. Mirroring 1.8. Primjedba za prevodioce 1.9. Pravo kopiranja i raspodjele Sta je soket? 2.1. Dva tipa internet soketa 2.2. Besmislice o niskom nivou i teorija mrea Strukture i rukovanje podacima 3.1. Prevedi primitive! 3.2. IP Adrese i kako rukovati njima Sistemski pozivi 4.1. socket() - Daj mi fajl-deskriptor! 4.2. bind() - Na kom sam portu? 4.3. connect() - Hej, ti! 4.4. listen() - Molim vas, hoe li me neko nazvati? 4.5. accept() - "Hvala vam to ste zvali port 3490." 4.6. send() i recv() - Priaj sa mnom, lutko! 4.7. sendto() i recvfrom() - Priaj sa mnom, DGRAM-stil 4.8. close() i shutdown() - Bjei mi s oiju! 4.9. getpeername() - Ko si sad pa ti? 4.10. gethostname() - Ko sam ja!? 4.11. DNS - ti kae "bijelakuca.gov", ja kaem "198.137.240.92" Pozadina klijent-servera 5.1. Primjer jednostavnog stream servera 5.2. Primjer jednostavnog stream klijenta 5.3. Datagram soketi Neto naprednije tehnike 6.1. Blokiranje 6.2. select() - Sinhrono (paralelno, istovremeno (prim. prev.)) U/I multipleksiranje 6.3. Rukovanje parcijalnim send() funkcijama 6.4. O enkapsulaciji podataka Vie podataka o ovoj temi 7.1. man stranice 7.2. Knjige 7.3. Reference na internetu 7.4. RFC-i esto postavljena pitanja Objava i poziv u pomo

WWW.NHC-Team.ORG

Str.

2

1. Uvod Hej! Soket programiranje te umorilo? ini ti se da je malo preteko ove stvari shvatiti iz man stranica? Htio bi da pravi cool internet programe, ali nema vremena da prolazi kroz gomilu struktura pokuavajui da shvati da li treba da pozove bind() prije connect(), itd., itd. E pa, zna ta! Ve sam sm uradio sav taj prljavi posao, i umirem od elje da podijelim te informacije sa svima! Doao si na pravo mjesto. Ovaj bi dokument trebao dati prosjenom C strunjaku neko dovoljno znanje za hvatanje u kotac sa mrenim programiranjem. 1.1. Sasluanje Ovaj je dokument napravljen kao udbenik, ne kao prirunik. Vjerovatno je najbolji za one koji tek poinju sa internet programiranjem, i potreban im je oslonac. Ovo, naravno, nije kompletan vodi kroz soket programiranje. Ipak, nadam se da e biti dovoljan da one man stranice ponu da zvue smisleno... :-) 1.2. Platforma i kompajler Kd napisan u ovom dokumentu je kompajliran na Linux PC-u koristei GNU gcc kompajler. Ipak, trebao bi da radi na bilo kojoj platformi koristei gcc. Prirodno, ovo se ne odnosi na situaciju kada programira za Windows, vidi sekciju za Windows programere, ispod. 1.3. Zvanina glavna strana Zvanina lokacija ovog dokumenta je na Kalifornijskom Univerzitetu, Chico, na http://www.ecst.csuchico.edu/~beej/guide/net/. 1.4. Primjedba za Solaris/SunOS programere Kad programira za SunOs i Solaris, mora da stavi neke dodatne parametre komandne linije, za povezivanje sa odgovarajuim bibliotekama. U svrhu toga, jednostavno dodaj "-lnsl -lsocket -lresolv" na kraj komande za kompajliranje, kao ispod:

$ cc -o server server.c -lnsl -lsocket -lresolvAko jo uvijek dobija poruke o grekama, pokuaj dodati "-lxnet" na kraj komandne linije. Ne znam za ta slui, tano, ali izgleda da treba nekim ljudima. Jo jedno mjesto gdje moe naii na problem je mjesto gdje poziva funkciju setsockopt(). Deklaracija se razlikuje od one na mojoj Linux maini, tako da umjesto:

int yes=1;unesi ovo:

char yes='1';Poto nemam SunOS mainu, nisam testirao nita od gore-spomenutih informacija to je sve samo ono to sam ja dobio elektronskom potom od drugih ljudi. 1.5. Primjedba za Windows programere Lino mi se ne dopada Windows, i preporuujem ti da proba Linux, BSD, ili Unix. Poto sam to rekao, ipak moe sve ovo da koristi i pod Windowsom. Prvo, preskoi sve sistemske .h datoteke koje sam ovde spomenuo. Sve to ti je potrebno da ukljui je:

#include

WWW.NHC-Team.ORG

Str.

3

ekaj! Takoe mora da pozove WSAStartup() prije nego to pone bilo ta drugo da radi sa soketima. Evo kda koji to radi:

#include { WSADATA wsaData; // ako ovo ne radi //WSAData wsaData; // probaj ovo if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) { fprintf(stderr, "WSAStartup failed.\n"); exit(1); }Takoe mora da kae kompajleru da se povezuje sa Winsock bibliotekom, koja se obino nalazi u datoteci wsock32.lib ili winsock32.lib ili neto slino. U Visual C++-u, ovo se radi kroz Project meni, pod opcijom Settings.... Klikni na Link jeziak, i potrai listu "Object/library modules". Dodaj "wsock32.lib" toj listi. Ili tako sam ja bar uo. Na kraju, mora da pozove funkciju WSACleanup() kad vie ne koristi biblioteku za rad sa soketima. Pogledaj na mrei detalje o ovoj temi. Ako sve ovo uradi, primjeri iz ove knjige bi trebali da funkcioniu uglavnom, sa izuzetkom par stvari. Pod jedan, ne moe koristiti close() da zatvori soket mora da koristi closesocket(), umjesto toga. Takoe, select() radi samo sa soket-deskriptorima, ne i sa fajl-deskriptorima (poput 0 za stdin (standardni ulaz)). Takoe, postoji klasa za rad sa soketima, CSocket. Provjeri help stranice svog kompajlera radi vie informacija. Vie informacija o Winsock-u ima na Winsock FAQ. Konano, douo sam da Windows nema fork() sistemskog poziva kog sam, naalost, koristio u nekim svojim primjerima. Probaj da koristi CreateProcess() umjesto njega. fork() ne prima argumente, a CreateProcess() prima oko etrdeset milijardi argumenata. Ako ti se to ne dopada, CreateThread() je neto laka za probavu... naalost rasprava o nitima u programiranju ne ulazi u sastav ovog teksta. Rekao sam to sam mogao.

1.6. U vezi elektronske pote Generalno, mogu odgovarati na pitanja postavljena elektronskom potom, ali ne garantujem. Vodim ivot sa malo slobodnog vremena, i postoje trenuci kad jednostavno ne mogu odgovarati na pitanja. Kada je to sluaj, obino samo obriem poruku. Nita lino; jednostavno, nikad neu imati vremena da ti dam detaljno objanjenje svega to ti treba. Kao uopteno pravilo, to je sloenije pitanje koje postavi manja je vjerovatnoa da u odgovoriti. Ako suzi pitanje prije nego to ga poalje i ukljui sve umjesne informacije (kao platforma, kompajler, poruke o grekama, i bilo ta drugo), vea je vjerovatnoa da e dobiti odgovor. Proitaj ESR-ov dokument, Kako postaviti pametna pitanja. Ako ne dobije odgovor, probaj sam neto da sredi, da nae odgovor, a ako ne uspije, poalji mi pismo opet sa informacijama koje si dodatno uspio da pronae. Sad kad sam te ugnjavio kako da mi pie a kako ne, samo da ti dam do znanja da mnogo cijenim svu podrku i zahvalnost koju sam primio tokom godina, povodom vodia. To je prava moralna podrka, i drago mi je da ujem da ga ljudi mnogo koriste! :-) Hvala! 1.7. Mirroring Vie si nego dobrodoao da takoe iskopira ovaj sajt drugdje, privatno ili javno. Ako ga objavi javno, poalji mi link da ga spojim sa svoje glavne strane; poalji ga na . 1.8. Primjedba za prevodioce Ako hoe da prevede vodi na drugi jezik, pii mi na i staviu hiperlink ka tvom prevodu na svoju glavnu stranu.

WWW.NHC-Team.ORG

Str.

4

Slobodno stavi svoju email adresu i ime u prevod. ao mi je, ali zbog kvote (ogranienog prostora), ne mogu stavljati prevod na svoj sajt. 1.9. Pravo kopiranja i raspodjele Beej-ov vodi za mreno programiranje je zatien. Copyright 1995-2001 Brian "Beej" Hall. Ovaj vodi se slobodno moe tampati i kopirati, ako se njegov prvobitni sadraj ne promijeni, i ako bude kompletan, i takoe se prikau informacije o njegovoj zatienosti i pravu kopiranja i raspodjele. Predavaima se naroito preporuuje da preporuuju ili dijele kopije ovog vodia svojim studentima.Dokument se slobodno moe prevoditi na druge jezike, ako je prevod precizan i taan, i obuhvata kompletan prvobitni dokument. Prevod takoe moe da sadri informacije o imenu i nainu kontaktiranja prevodica. Izvorni C kd u ovom dokumentu je ovim odobren za javnost. Kontaktiraj za vie informacija. 2. ta je soket? uo si da se pria o "soketima" itavo vrijeme, a moda se cijelo vrijeme pita ta je to ustvari tano. Pa, oni su sledee: nain komuniciranja sa ostalim programima koristei standardne UNIX-ove fajl-deskriptore. Dobro, moda si uo izjavu nekog UNIX hakera: "Bog te, sve u UNIX-u je datoteka!" Ono to je ta osoba ustvari priala je injenica da kada UNIX programi ine bilo kakav U/I, ine ga itanjem ili pisanjem po fajl-deskriptoru. Fajl-deskriptor je mali cio broj pridruen otvorenom fajlu (datoteci). Ali (i ba tu je caka), datoteka moe biti mrena konekcija, FIFO, cijev, terminal, prava datoteka na disku, ili uostalom bilo ta. Sve u UNIX-u je datoteka! Na taj nain, komunikacija sa drugim programom preko interneta se obavlja preko fajl-deskriptora, vjerovao ili ne. "Kako dobijem ovaj deskriptor za mrenu komunikaciju, Gosp. Pametni?" je vjerovatno poslednje pitanje koje ti je sad na umu, ali svejedno u da odgovorim na njega: Koristi poziv sistemske funkcije socket(). Ona vraa soket-deskriptor, i onda komunicira preko njega koristei specijalizovane soket pozive send() i recv() (man send, man recv). "Hej, ekaj!" mogao bi sad da uzvikuje. "Ako je to fajl-deskriptor, zato ne bih mogao, u ime Neptuna, jednostavno koristiti read() i write() da komuniciram preko soket-deskriptora?" Kratak odgovor je "Pa mogao bi!" Dug odgovor je, "Mogao bi, ali send() i recv() pruaju mnogo veu kontrolu razmjene podataka." ta dalje? ta misli o ovome: Ima mnogo vrsta soketa. Postoje DARPA Internet adrese (internet soketi), staze do datoteka kao nodova na disku (UNIX soketi), CCITT X.25 adrese (X.25 soketi koje slobodno moe da ignorie), i vjerovatno mnogi drugi zavisno od toga kakav UNIX koristi. Ovaj dokument obrauje samo one prve: internet sokete. 2.1. Dva tipa internet soketa ta je ovo? Postoje dva tipa internet soketa? Da. Pa, dobro, ne. Laem. Ima ih vie, ali nisam htio da te preplaim. Ovdje u priati samo o dva tipa. Osim u ovoj reenici kad u da kaem da su "sirovi soketi (raw sockets)" takoe jako moni i trebalo bi da ih pogleda. Da ponemo ve jednom. Koja su to dva tipa? Prvi je "stream socket"; drugi je "datagram socket", koje emo ubudue vjerovatno zvati "SOCK_STREAM" i "SOCK_DGRAM", tim redom. Datagram soketi se ponekad nazivaju "nepovezani soketi". (Iako mogu biti connect()-ovani ako to stvarno hoe. Pogledaj connect(), dalje dole.) Stream soketi su pouzdani dvosmjerni povezani komunikacioni provodnici. Ako poalje dva objekta u soket, rasporedom "1, 2", oni e i da stignu u rasporedu "1, 2" na odredite. Takoe, ti objekti tamo nee sadrati greke. Sve greke s kojim se suoi su plod tvog sopstvenog poremeenog uma, i nee se o njima ovdje raspravljati. ta koristi stream soket? Pa vjerovatno si uo za program telnet? On koristi stream soket. Sve to otkuca treba da stigne u istom rasporedu na drugi kraj, je li tako? Takoe, svi web brauzeri koriste HTTP protokol koji koristi stream sokete da dou do internet stranica. Zaista, ako se "telnetuje" na web-site na portu 80, i otkuca "GET /", dobie zauzvrat HTML stranu! Kako stream soketi dobijaju ovaj visoki nivo kvaliteta protoka podataka? Oni koriste protokol "The Transmission Control Protocol (Protokol za kontrolu prenosa podataka)", poznat u narodu kao "TCP" (vidi RFC-793 za izvanredno detaljne podatke o TCP-u.) TCP osigurava da podaci stignu u istom rasporedu i bez greaka. Moda si ve uo za "TCP" kao dio WWW.NHC-Team.ORG Str.

5

skraenice "TCP/IP" gdje "IP" znai "Internet Protocol" (vidi RFC-791.) IP prvenstveno radi sa Internet usmjeravanjem i nije odgovoran za integritet podataka. Super. ta ima da se kae za datagram sokete? Zasto se kae za njih da su "nepovezani"? O emu se tu, uopte, radi? Zato oni nisu pouzdani? Pa evo nekih injenica: Ako poalje datagram, moda i stigne. Moda stigne u drugaijem rasporedu. Ako stigne, podaci u paketu e biti bez greaka, ipak. Datagram soketi takoe koriste IP za usmjeravanje, ali oni ne koriste TCP; oni pak koriste"User Datagram Protocol (Protokol za korisnike datagrame)", ili "UDP" (vidi RFC-768.) Zato su oni nepovezani? Pa, u osnovi, to je zbog toga to ne mora da odrava otvorenu konekciju kao to mora sa stream soketima. Samo napravi paket, udari mu IP zaglavlje koje sainjava adresa odredita, i poalje ga. Nije potreban spoj. Uglavnom se koriste za paket-po-paket protoke informacija. Neke aplikacije koje ih koriste: tftp, bootp, itd. "Dosta!" moda vriti. "Kako ovi programi uopte rade ako se paketi mogu izgubiti na mrei?!" Pa, zemljanine, svaki od njih ima sopstveni protokol na vrhu UDP-a. Na primjer, protokol tftp kae da za svaki paket koji se poalje, prijemnik mora da poalje natrag drugi paket koji kae, "Imam ga!" ("ACK" paket.) Ako poiljalac prvobitnog paketa ne dobije odgovor u roku, recimo, pet sekundi, slae paket ponovo dok konano ne dobije ACK. Ovakva procedura je vrlo bitna kad se ostvaruju SOCK_DGRAM aplikacije. 2.2. Besmislice o niskom nivou i teorija mrea Poto sam upravo spomenuo nivoe protokola, vrijeme je da priamo kako mree stvarno rade, i da pokaem neke primjere kako se SOCK_DGRAM paketi izgrauju. Praktino, vjerovatno moete da preskoite ovu lekciju. Ipak, ovo gradivo ini dobru pozadinu za sledee. Slika 1. Enkapsulacija podataka.

Hej, djeco, vrijeme je da se ui o enkapsulaciji podataka! Ovo je jako bitno. Toliko je bitno da se o tome ve ui ovdje na univerzitetu iko ;-). U principu, tvrdi se sledee: paket je roen, paket je umotan ("enkapsuliran") u zaglavlje (i rijetko u podnoje) od strane prvog protokola (npr, TFTP protokola), a onda se sve to (skupa sa TFTP zaglavljem) enkapsulira ponovo od sledeeg protokola (npr. UDP-a), onda ponovo od sledeeg (IP), i onda ponovo od poslednjeg protokola na hardverskom (fizikom) sloju (npr, Ethernet-u). Kad drugi raunar primi paket, hardver skida IP i UDP zaglavlja, TFTP program skida TFTP zaglavlje, i taj raunar konano ima prave podatke. Sad konano mogu da priam o neomiljenom modelu mree u vie nivoa (Layered Network Model). Ovaj mreni model opisuje sistem mrene funkcionalnosti koja ima mnoge prednosti nad ostalim modelima. Na primjer, moe pisati soketprograme koji su u potpunosti isti, i da ne brine kako se podaci ustvari prenose (serijski, tanki Ethernet, AUI, ta god) jer programi na niem nivou sve to sreuju za tebe. Stvarni mreni hardver i topologija su transparentni soketprogrameru. Bez daljeg zadravanja, predstaviu ti slojeve tog modela u punom svjetlu. Zapamti ovo za ispit iz mrea: Aplikacioni (Application) Prezentacijski (Presentation) Sesioni (Session) Transportni (Transport) Mreni (Network) Spoj spone podataka (Data Link) Fiziki (Physical) Str.

WWW.NHC-Team.ORG

6

Fiziki sloj je hardver (serijski, Ethernet, itd.). Aplikacioni je onoliko daleko od fizikog to god vie moe da zamisli to je mjesto gdje korisnici imaju dodir sa mreom. E sad, ovaj model je toliko uopten da bi mogao da ga koristi kao vodi za popravku automobila ako bi htio. Slojeviti model koji je vie u skladu sa UNIX-om bi mogao da bude sledei: Aplikacioni sloj (telnet, ftp, itd.) "Host-to-Host" (server serveru) transportni sloj (TCP, UDP) Internet sloj (IP i usmjeravanje) Sloj mrenog pristupa (Ethernet, ATM, ili ta god)

U ovom trenutku, vjerovatno vidi kako ovi slojevi odgovaraju enkapsulaciji prvobitnih podataka Jel' vidi koliko posla ima oko enkapsuliranja paketa podataka? Gospode! A zna li da mora da ukucava adresu u zaglavlje koristei "cat"?! alim se, alim se. Sve to treba da uradi za stream sokete je da ih poalje (send()) vani. Sve to treba da uradi za datagram sokete je da enkapsulira paket metodom koji ti izabere i da ga poalje (sendto()) napolje. Jezgro samo gradi transportni sloj i internet sloj, hardver pravi sloj mrenog pristupa, takoe sam. Ah, moderna tehnologija. Tako se zavrava na kratki pohod u teoriju mree. Eh da, zaboravio sam da ti kaem sve to sam htio o usmjeravanju, a to je: nita. Upravo tako, uopte neu priati o usmjeravanju. Usmjerava "oguli" paket do IP zaglavlja, pogleda u njegovu tabelu usmjeravanja, bla bla bla. Pogledaj IP RFC ako te stvarno zanima. Ako nikad o tome ne naui, pa dobro, ostae iv. 3. struct-ure i rukovanje podacima Konano smo ovde. Vrijeme je da priamo o programiranju. U ovom dijelu, pokriu razne tipove podataka koritene u obraanju soketima, poto su neke od njih prava muka za shvatiti. Prvo neto lako: soket-deskriptor. Soket-deskriptor je sledeeg tipa:

intNajobiniji cio broj. Stvari odavde pa nadalje postaju uvrnute, tako da samo itaj i trpi me. Znaj ovo: postoje dva ureenja bajtova: najvaniji bajt (ponekad poznat kao "oktet") na prvom mjestu, i pod dva: najmanje bitan bajt na prvom mjestu. Ovaj prethodni je nazvan "Mreno ureenje bajtova" (Network Byte Order). Neke maine interno smjetaju svoje brojeve u mrenom ureenju bajtova, neke ne. Kad kaem da neto mora biti u mrenom ureenju bajtova, mora da pozove neku funkciju (recimo htons()) da ga prevede iz "serverskog ureenja bajtova" (Host Byte Order). Ako ne spomenem "mreno ureenje bajtova", onda moe da ga ostavi u serverskom ureenju bajtova. (Za radoznale, "mreno ureenje bajtova" je takoe poznato kao "Big-Endian Byte Order".) Moja Prva StrukturaTM - struct sockaddr. Ova struktura uva informacije o adresi soketa za mnoge tipove soketa:

struct sockaddr { unsigned short char };

sa_family; sa_data[14];

// familija adrese, AF_xxx // 14 bajtova adrese protokola

sa_family moe biti mnotvo stvari, ali bie AF_INET za sve to mi radimo u ovom dokumentu. sa_data sadri odredinu adresu i broj porta za soket. Ovo je prilino nezgrapno poto niko nee da runo, mukotrpno pakuje adresu u sa_data. Da bi radili sa struct sockaddr, programeri su razvili paralelnu strukturu: struct sockaddr_in ("in" kao "internet".)

struct sockaddr_in { short int sin_family; unsigned short int sin_port;WWW.NHC-Team.ORG

// Familija adrese // Broj portaStr.

7

struct in_addr unsigned char };

sin_addr; // Internet adresa sin_zero[8]; // Da bude iste veliine kao struct sockaddr

Ova struktura ini lakim da se obraamo elementima adrese soketa. Primijeti da bi sin_zero (koji je ukljuen da produi strukturu do duine strukture struct sockaddr) trebao biti podeen na sve same nule funkcijom memset(). Takoe, a ovo je JAKO bitno, pokaziva na strukturu struct sockaddr_in moe biti kastovan u pokaziva na struct sockaddr i obrnuto. Tako da, iako socket() oekuje struct sockaddr *, moe koristiti struct sockaddr_in i kastovati kad zatreba! Takoe, primijeti da sin_family odgovara sa_family u strukturi struct sockaddr i treba da bude podeen na AF_INET. Konano, sin_port i sin_addr moraju biti u mrenom ureenju bajtova! "Ali," protivi se ti, "kako moe cijela struktura, struct in_addr sin_addr, biti u mrenom ureenju bajtova?" Ovo pitanje zahtijeva paljiv prilaz strukturi struct in_addr, jednoj od najgorih ivih unija:

// Internet adresa (struktura zbog istorijskih razloga) struct in_addr { unsigned long s_addr; // to je 32 bita duine, ili 4 bajta };Pa, nekad je to bila unija, ali sad su, izgleda, ti dani proli. Dobro izbavljenje. Tako ako si predstavio ina da bude tipa struct sockaddr_in, onda ina.sin_addr.s_addr predstavlja etvorobajtnu IP adresu (u mrenom ureenju bajtova). Primijeti da ak iako tvoj sistem moda koristi od Boga prognanu uniju umjesto strukture za struct in_addr, ipak moe da se obrati etvorobajtnoj adresi ba kao to sam i ja iznad (Ovo zahvaljujui #define-ovima) 3.1. Prevedi primitive! Eto nas dovedenih pravac u sledee poglavlje. Dosta je bilo prie o "mreno u serversko ureenje" prevoenjima vrijeme je za akciju. E, fino. Postoje dva tipa koja moe prevesti: short (dva bajta) i long (etiri bajta). Ove funkcije rade i sa unsigned verzijama isto tako dobro. Recimo da hoe da prevede neki short iz serverskog ureenja bajtova u mreno ureenje bajtova. Poni sa "h" za "host" (server), nastavi sa "to" (u prevedi u), i onda "n" za "network" (mrea), i "s" za "short": h-to-n-s, or htons() (ita se: "Host to Network Short"). Skoro da je prejednostavno.... Moe koristiti bilo koju kombinaciju "n", "h", "s", i "l", iskljuujui one stvarno glupe. Npr., nema stolh() ("Short to Long Host") funkcije ne na ovoj urci, zapravo. Ali postoje:

htons() - "Host to Network Short" htonl() - "Host to Network Long" ntohs() - "Network to Host Short" ntohl() - "Network to Host Long"

Sad, moda ti se uini da ulazi polako u ovo. Moe pomisliti "ta ako treba da promijenim raspored bajtova u promjenjivoj tipa char?" Onda e moda pomisliti, "Uh, nema veze." Moe takoe pomisliti da, budui da tvoja maina "68000" ve koristi mreno ureenje bajtova, pa da ti ne mora pozivati htonl() na svojim IP adresama. Bio bi u pravu, ALI ako pokua da prenese program na mainu koja ima obrnut raspored, program e pasti. Neka ti programi budu prenosivi! Ovo je svijet UNIX-a! (Koliko god Bil Gejts htio misliti drugaije.) Zapamti: stavi bajtove u mreno ureenje prije nego to odu na mreu. Jedna stavka za kraj: Zato sin_addr i sin_port moraju biti u mrenom ureenju bajtova u strukturi struct sockaddr_in, a sin_family ne mora? Odgovor je: sin_addr i sin_port se enkapsuliraju u paket na IP i UDP slojevima, redom. Stoga, moraju biti u tom ureenju. S druge strane, sin_family polje je koriteno samo od strane jezgra da sazna kakav tip adrese struktura sadri, pa mora biti u serverskom ureenju bajtova. Takoe, poto sin_family ne biva poslata napolje na mreu, ona u svakom sluaju moe biti u serverskom ureenju bajtova.

3.2. IP Adrese i kako rukovati njima Na sreu po tebe, postoji mnotvo funkcija koje rukuju IP adresama. Nema potrebe da ih prevodi runo i stavlja u long pomou