Beej-ov vodič za
mrežno programiranje |
||
|
Hej! Soket programiranje te umorilo? Čini ti se da je malo preteško ove stvari shvatiti iz man stranica? Htio bi da praviš cool internet programe, ali nemaš vremena da prolaziš kroz gomilu struktura pokušavajući da shvatiš da li treba da pozoveš bind() prije connect(), itd., itd.
E pa, znaš šta! Već sam sâm uradio sav taj prljavi posao, i umirem od želje da podijelim te informacije sa svima! Došao si na pravo mjesto. Ovaj bi dokument trebao dati prosječnom C stručnjaku neko dovoljno znanje za hvatanje u koštac sa mrežnim programiranjem.
Ovaj je dokument napravljen kao udžbenik, ne kao priručnik. Vjerovatno je najbolji za one koji tek počinju 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 počnu da zvuče smisleno... :-)
Kôd napisan u ovom dokumentu je kompajliran na Linux PC-u koristeći GNU gcc kompajler. Ipak, trebalo bi da radi na bilo kojoj platformi koristeći gcc. Naravno, ovo se ne odnosi na situaciju kada programiraš za Windows, vidi sekciju za Windows programere, ispod.
Zvanična lokacija ovog dokumenta je na Kalifornijskom Univerzitetu, Chico, na http://www.ecst.csuchico.edu/~beej/guide/net/.
Kad programiraš za SunOS i Solaris, moraš da staviš neke dodatne parametre komandne linije, za povezivanje sa odgovarajućim bibliotekama. U svrhu toga, jednostavno dodaj "-lnsl -lsocket -lresolv" na kraj komande za kompajliranje, kao ispod:
$ cc -o server server.c -lnsl -lsocket -lresolv |
Ako još uvijek dobijaš poruke o greškama, pokušaj dodati "-lxnet" na
kraj komandne linije. Ne znam za šta služi, tačno, ali izgleda da treba nekim
ljudima.
Još jedno mjesto gdje možeš naići na problem je mjesto gdje pozivaš funkciju setsockopt(). Deklaracija se razlikuje od one na mojoj Linux mašini, tako da umjesto:
int yes=1; |
unesi ovo:
char yes='1'; |
Pošto nemam SunOS mašinu, nisam testirao ništa od gore-pomenutih
informacija – to je sve samo ono što sam ja dobio elektronskom poštom od drugih
ljudi.
Lično mi se ne dopada Windows, i preporučujem ti da probaš Linux, BSD, ili Unix. Bez obzira na to, ipak možeš sve ovo da koristiš i pod Windowsom.
Prvo, preskoči sve sistemske .h datoteke koje sam ovde spomenuo. Sve što ti je potrebno da uključiš je:
#include <winsock.h> |
Čekaj! Takođe moraš da pozoveš WSAStartup() prije nego što počneš bilo šta drugo da
radiš sa soketima. Evo kôda koji to radi:
#include <winsock.h> { WSADATA wsaData; // ako ovo ne radi //WSAData wsaData; // probaj ovo if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) { fprintf(stderr, "WSAStartup failed.\n"); exit(1); } |
Takođe moraš da kažeš kompajleru da se povezuje sa Winsock bibliotekom, koja
se obično nalazi u datoteci wsock32.lib
ili winsock32.lib
ili nešto slično. U Visual C++-u, ovo se radi kroz Project meni, pod opcijom Settings....
Klikni na Link
jezičak, i potraži listu "Object/library modules". Dodaj
"wsock32.lib" toj listi.
Ili tako sam ja bar čuo.
Na kraju, moraš da pozoveš funkciju WSACleanup() kad više ne koristiš biblioteku za rad sa soketima. Pogledaj na mreži detalje o ovoj temi.
Ako sve ovo uradiš, primjeri iz ove knjige bi trebali da funkcionišu uglavnom, sa izuzetkom par stvari. Pod jedan, ne možeš koristiti close() da zatvoriš soket – moraš da koristiš closesocket(), umjesto toga. Takođe, select() radi samo sa soket-deskriptorima, ne i sa fajl-deskriptorima (poput 0 za stdin (standardni ulaz)).
Takođe, postoji klasa za rad sa soketima, CSocket. Provjeri help stranice svog kompajlera radi više informacija.
Više informacija o Winsock-u ima na Winsock FAQ.
Konačno, dočuo sam da Windows nema fork() sistemskog poziva kog sam, nažalost, 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 nešto lakša za probavu... nažalost rasprava o nitima u programiranju ne ulazi u sastav ovog teksta. Rekao sam što sam mogao.
Generalno, mogu odgovarati na pitanja postavljena elektronskom poštom, ali ne garantujem. Vodim život sa malo slobodnog vremena, i postoje trenuci kad jednostavno ne mogu odgovarati na pitanja. Kada je to slučaj, obično samo obrišem poruku. Ništa lično; jednostavno, nikad neću imati vremena da ti dam detaljno objašnjenje svega što ti treba.
Kao uopšteno pravilo, što je složenije pitanje koje postaviš – manja je vjerovatnoća da ću odgovoriti. Ako suziš pitanje prije nego što ga pošalješ i uključiš sve umjesne informacije (kao platforma, kompajler, poruke o greškama, i bilo šta drugo), veća je vjerovatnoća da ćeš dobiti odgovor. Pročitaj ESR-ov dokument, Kako postaviti pametna pitanja.
Ako ne dobiješ odgovor, probaj sam nešto da središ, da nađeš odgovor, a ako ne uspiješ, pošalji mi pismo opet – sa informacijama koje si dodatno uspio da pronađeš.
Sad kad sam te ugnjavio kako da mi pišeš a kako ne, samo da ti dam do znanja da mnogo cijenim svu podršku i zahvalnost koju sam primio tokom godina, povodom vodiča. To je prava moralna podrška, i drago mi je da čujem da ga ljudi mnogo koriste! :-) Hvala!
Više si nego dobrodošao da takođe iskopiraš ovaj sajt drugdje, privatno ili javno. Ako ga objaviš javno, pošalji mi link da ga spojim sa svoje glavne strane; pošalji ga na <beej@piratehaven.org>.
Ako hoćeš da prevedeš vodič na drugi jezik, piši mi na <beej@piratehaven.org> i staviću hiperlink ka tvom prevodu na svoju glavnu stranu.
Slobodno stavi svoju email adresu i ime u prevod.
Žao mi je, ali zbog kvote (ograničenog prostora), ne mogu stavljati prevod na svoj sajt.
Beej-ov vodič za mrežno programiranje je zaštićen. Copyright © 1995-2001 Brian "Beej" Hall.
Ovaj vodič se slobodno može štampati i kopirati, ako se njegov prvobitni sadržaj ne promijeni, i ako bude kompletan, i takođe se prikažu informacije o njegovoj zaštićenosti i pravu kopiranja i raspodjele.
Predavačima se naročito preporučuje da preporučuju ili dijele kopije ovog vodiča svojim studentima.
Dokument se slobodno može prevoditi na druge jezike, ako je prevod precizan i tačan, i obuhvata kompletan prvobitni dokument. Prevod takođe može da sadrži informacije o imenu i načinu kontaktiranja prevodica.
Izvorni C kôd u ovom dokumentu je ovim odobren za javnost.
Kontaktiraj <beej@piratehaven.org> za više informacija.
Beej-ov vodič za mrežno programiranje |
|
Šta je soket? |