160 likes | 293 Views
Süsteemprogrammeerimine keeles C ja C#. Neljateistkümnes loeng. Eelmisest korrast. Protsesside omavaheline suhtlus samas masinas puudu Protsessidevaheline kommunikatsioon üle võrgu. Socketid (maakeelde ei vääna!). Socketid on võrguprotokollist suhteliselt sõltumatu abstraktsioon
E N D
Süsteemprogrammeerimine keeles C ja C# Neljateistkümnes loeng
Eelmisest korrast Protsesside omavaheline suhtlus samas masinas puudu Protsessidevaheline kommunikatsioon üle võrgu
Socketid (maakeelde ei vääna!) Socketid on võrguprotokollist suhteliselt sõltumatu abstraktsioon Klient/Server idee: üks ootab, teine ühendub
Socketeid on palju Ühendused käivad reeglina pordilt pordile Iga ühenduse jaoks on vaja vähemalt ühte socketit http://www.csse.monash.edu.au/courseware/cse3420/Lectures/Module4/topic1.html
Socketeid on mitmesuguseid Ühenduv socket (Klient) Kuulav socket (Server) Eriotstarbeline socket (nt raw socket) Saab jaotada ka protokolli järgi: Ühendusega protokolli socket (nt TCP) Ühenduseta protokolli socket (nt UDP) IPC socket (väga levinud IPC variant UNIXi all)
Kasutamiseks hulk “System Call'e” http://comet.ctr.columbia.edu/distributed/programming/tuto1/sld004.htm
Kasutamiseks hulk “System Call'e” http://comet.ctr.columbia.edu/distributed/programming/tuto1/sld005.htm
Ühenduse tekitamine (Klient) Luua socket s = socket(addrtype, SOCK_STREAM, 0) Ühenduda connect(s,(struct sockaddr *)&sa,sizeof sa) Lugeda/Kirjutada recv/send(s, buf, len, 0) (Windows) võiread/write(s, buf, len) (UNIX) Sulgeda socket closesocket(s) (Windows) või close(s) (UNIX)
Sockaddr atribuudi täitmine Sockaddr näitab aadressi kuhu ühenduda IP põhist varianti (sockaddr_in) saab täita kas: Otse IP aadressi ja pordiga Tehes kõigepealt nimest IP ja lisades pordi Täitmine aadressiga: sock_addr.sin_addr.s_addr = inet_addr(“195.222.0.1”); sock_addr.sin_port = htons(5115); sock_addr.sin_family = AF_INET
Baidijärjekord on oluline! Võrgust lugedes ja kirjutades PEAB arvestama baidijärjekorraga Selleks on kaks paari funktsioone: ntohs ja htons – short int tüüpi andmete jaoks ntohl ja htonl – long int tüüpi andmete jaoks Tekstiliste andmete (stringid, charid) puhul oleneb konvertimine KOODITABELIST!
Näited! Lihtne klient, mis ühendub ja loeb (finger) Lihtne klient, mis küsib pealehte (http)
Ühenduste vastuvõtmine (Server) Luua socket s = socket(addrtype, SOCK_STREAM, 0) Määrata kuulatav aadress ja port bind(s,(struct sockaddr *)&sa, sizeof(struct sockaddr_in)) Alustada kuulamist listen(s, n)
Kliendi teenindamine (Server) Iga kliendi jaoks: Võtta ühendus vastu t = accept(s,NULL,NULL) Lugeda/Kirjutada recv/send(t, buf, len, 0) (Windows) võiread/write(t, buf, len) (UNIX) Sulgeda socket closesocket(t) (Windows) või close(t) (UNIX)
Serveri arhitektuur Saab valida nelja variandi vahel: Teenindatakse ainult üht klienti (single connection) Teenindatakse n klienti mitme protsessiga Teenindatakse n klienti mitme threadiga Teenindatakse n klienti mitteblokeeruva I/O abil Kui võimalik tasub eelistada threaditud mudelit, samas UNIXi jaoks on internetis palju valmis koodi, mida saab taaskasutada: GIYF!
Näited! Single connection ainult kirjutav server Esimese edasiarendus threadide peale Lugev ja kirjutav server
Materjale iseseisvaks lugemiseks http://www.frostbytes.com/~jimf/papers/sockets/sockets.html http://www.cs.rpi.edu/courses/sysprog/sockets/sock.html http://www.scit.wlv.ac.uk/~jphb/cp3024/notes/slides/week1.l.00.html http://www.troubleshooters.com/codecorn/sockets/ http://comet.ctr.columbia.edu/distributed/programming/tuto1/sld001.htm http://www.cs.utexas.edu/users/lavender/courses/socket++/ http://www.csse.monash.edu.au/courseware/cse3420/Lectures/Module4/topic1.html