Socket Programozas

Download Socket Programozas

Post on 12-Jul-2015

62 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

<p>TCP/IP szlltsi rteg ( socket programozsi interfsz )</p> <p>sszelltotta:</p> <p>Mohcsi Jnos BME Informatikai Kzpont</p> <p>BME Szmtgphlzatok jegyzet. Csak bels hasznlatra. Minden jog fenn tartva. Copyright 2000, BME Irnytstechnika s Informatika Tanszk</p> <p>TCP/IP socket programozi interfsz</p> <p>2</p> <p>1 TCP/IP</p> <p>1.1 TCP/IP S SOCKET INTERFSZ VISZONYAA TCP/IP rteges felptse: Alkalmazi program rteg Szlltsi rteg Internet rteg Adaptcis rteg Hordoz hlzat rteg A socket interfszt az 1980-as vek elejn, a University of California at Berkeley (UCB) egyik laborjban dolgoztk ki TCP/IP kezeli felleteknt, UNIX opercis rendszerekhez, azta UNIX szabvnyknt terjedt el, implementlva van a Windowsban is WinSock nven. A socket egy API (Application Program Interface), ami eredetileg Berkeley-UNIX -ban (4.x) jelent meg. System V. Release 4 is tvette, de abban van ms API is erre: TLI = Transport Layer Interface (Lsd szlltsi interfsz vizsglata). A socket processzek kztti kommunikcis eszkz, mely fggetlen attl, hogy a kommunikl processzek azonos, vagy klnbz gpen vannak-e, illetve amennyire lehet, elfedik a kommunikci megvalstsnak alsbb szintjeit. A kommunikci formja kliens-szerver alap, ami azt jelenti, hogy a szerver valamilyen jl definilt szolgltatst nyjt, amit a kliensek ignybe vesznek.</p> <p>BME Szmtgphlzatok jegyzet. Csak bels hasznlatra. Minden jog fenn tartva. Copyright 2000, BME Irnytstechnika s Informatika Tanszk -2-</p> <p>TCP/IP socket programozi interfsz</p> <p>3</p> <p>A host szerver kliens B host kliens hlzat hlzat</p> <p>1.2</p> <p>C host</p> <p>bra a kliens szerver kommunikcirl.</p> <p>Lehet kapcsolat-orientlt (connection-oriented) vagy kapcsolat nlkli (connectionless): minden adattviteli krsnl meg kell adni a clcmet. Szerver lehet iteratv (ilyenkor a szerver ciklusban vr, azonnal feldolgozza a berkezett krst, tipikusan akkoralkalmazott, ha minden krs feldolgozs vges s rvid idej), vagy konkurens (ilyenkor a szerver minden kiszolglskor fork()-ol, gyereke dolgozza fel, szl jra vr ciklusban a kvetkez krsre.) Ezek klnbz "kombincija" is megvalsithat (preforked, filedescriptor passing, stb.) ha nem blokkold vagy/s aszinkron rendszerhivsokat alkalmazunk.</p> <p>1.2.1.1</p> <p>BSD socket szerkezete:Felhasznli program socket knyvtr felhasznl kernel Stream fej SOCKMOD TPI: Transport Provider Interface Transport provider</p> <p>1. bra: Socket szerkezet SVR4 UNIX-ban BME Szmtgphlzatok jegyzet. Csak bels hasznlatra. Minden jog fenn tartva. Copyright 2000, BME Irnytstechnika s Informatika Tanszk -3-</p> <p>TCP/IP socket programozi interfsz</p> <p>4</p> <p> a felhasznli program szinte mint egy filedescriptort ltja a socket-et. Br nem minden filedescriptor mvelet mkdik (pl. lseek -&gt; ESPIPE zenet)</p> <p>1.3 A SOCKET RENDSZERHVSOKA Socket s TLI sszehasonltsa a rendelkezsre ll rendszerhvsok tekintetben: Szerep Funkci Socket TLI Szerver allokci/helyfoglals vgpont ltrehozs cmhez rendels queue mret llts vrakozs kapcsolat krelemre j filedescriptor ltrehozs Kliens allokci/helyfoglals vgpont ltrehozs cmhez rendels szerverhez kapcsolds Mindkettsocket() bind() connect() socket() bind() listen() accept() t_alloc() t_open() t_bind() t_listen()</p> <p>t_open() t_bind() t_accept() t_alloc() t_open() t_bind() t_connect()</p> <p>adattvitel (kapcsolat read() write() orintlt)recv() send()</p> <p>read() write() t_rcv() t_snd() t_rcvudata() t_sndudata()</p> <p>adattvitel (kapcsolat recvfrom() sendto() nlkli)recvmsg() sendmsg()</p> <p>kapcsolat lezrs</p> <p>close() shutdown()</p> <p>t_close() t_sndrel()</p> <p>BME Szmtgphlzatok jegyzet. Csak bels hasznlatra. Minden jog fenn tartva. Copyright 2000, BME Irnytstechnika s Informatika Tanszk -4-</p> <p>TCP/IP socket programozi interfszt_snddis()</p> <p>5</p> <p>Ezenkvl a kvetkez programozskor:ioctl() fcntl() select()</p> <p>rendszerhvsokat</p> <p>szoks</p> <p>hasznlni</p> <p>hlzati</p> <p>eszkzvezrl funkci filelert vezrel funkci szinkron/aszinkron multiplexelt I/O belltssa s</p> <p>vrakozs egy I/O esemnyre Ezekre rszletesen a multiplexelt, aszinkron I/O s nem blokkold I/O fejezetekben trnk ki.</p> <p>1.4 A SOCKET INTERFSZ LTALNOS LERSA1.4.1.1 A socket egy "communications domain" -hoz kapcsoldik a ltrehozskor:</p> <p> Loklis vagy UNIX domain (AF_LOCAL vagy AF_UNIX): gpen belli kommunikcihoz Internet domain (AF_INET, AF_INET6): hlzaton t, a kvetkez protokollokkal: TCP: Transmission Control Protocol UDP: User Datagram Protocol IP: Internet Protocol ICMP: Internet Control Message Protocol (Ezeket egytt szoks TCP/IP -nek is nevezni.) Egyb lehetsges protokollok: ATM, IPX, Appletalk, DECNET, XNS, OSI, de egyes esetekben IPSec kulcsmenedzsment (PF_KEY), hlzati krtyaszint (Netlink)1.4.1.2 Az tvitel tpusai:</p> <p> stream socket (SOCK_STREAM): kapcsolat-orientlt byte-stream: sorrendtart, megbzhat, ismtlds nlkli, nincs zenethatr. Tnyleges adatklds eltt a kapcsolatot fel kell pteni. datagram socket (SOCK_DGRAM) : kapcsolat nlkli, zenet-alap, nem megbzhat egyszer (raw) socket (SOCK_RAW) : kzvetlen hozzfrs a protokollhoz, annak adminisztrcijhoz, gy a felhasznl pthet sajt rtegeket sorrendes socket (SOCK_SEQPACKET) hasonl a streamhez, de BME Szmtgphlzatok jegyzet. Csak bels hasznlatra. Minden jog fenn tartva. Copyright 2000, BME Irnytstechnika s Informatika Tanszk -5-</p> <p>TCP/IP socket programozi interfsz</p> <p>6</p> <p>zenethatrokat is kzvetti, kapcsolat-orientlt, megbzhat megbzhat zenet socket (SOCK_RDM: reliably delivered message socket): megbzhat, kapcsolat nlkli, zenet-orientlt Nem minden domain tartalmaz minden socket tpusra megvalstst. tvitel tpusa SOCK_STREAM SOCK_DGRAM SOCK_RAW SOCK_SEQPACKET SOCK_RDM Kapcsolat -orientlt nlkli -orientlt nlkli sorrendtart megbzhat i n i n i n i i ismtls nlk. i n i n zenethatr n i i i</p> <p>1.4.1.3</p> <p>Protokoll-default-ok Internet protokollok (AF_INET s AF_INET6) esetn:</p> <p>AF_LOCAL SOCK_STREAM SOCK_DGRAM SOCK_RAW SOCK_SEQPACKET1.4.1.4 A kapcsolat-orientlt iddiagram:Kliens socket () bind () connect () Kapcsolat felvtel write () send() sendto() sendmsg() Hlzat</p> <p>AF_INET TCP UDP Protokolltl fggen TCP UDP</p> <p>AF_INET6</p> <p>+ +</p> <p>Protokolltl fggen</p> <p>IPv4/ICMPv4/IGMPv4 IPv6/ICMPv6</p> <p>Szerver socket () bind () listen () accept() Blokkoldik, mg krst nem kap</p> <p>read () recv() recvfrom() recvmsg() write ()</p> <p>feldolgozs</p> <p>read ()</p> <p>2. bra: Kapcsolatorientlt mkds iddiagramja</p> <p>BME Szmtgphlzatok jegyzet. Csak bels hasznlatra. Minden jog fenn tartva. Copyright 2000, BME Irnytstechnika s Informatika Tanszk -6-</p> <p>TCP/IP socket programozi interfsz1.4.1.5 A kapcsolat-nlkli iddiagram:Kliens socket() bind() sendto() sendmsg() Krs + adat recvfrom() recvmsg() ... sendto() SSI :SocketSer ce I er ace vi nt f Hlzat Szerver socket() bind()</p> <p>7</p> <p>recvfrom() SSI</p> <p>3. bra: Kapcsolat nlkli mkds iddiagramja Minden "kapcsolatot" egy 5-s azonost: {Protokoll, helyi gpcm, helyi processz portszm, tvoli gpcm, tvoli processz portszm} Az 5-s csoport megvltoztatsra a a kvetkez rendszerhvsok llnak rendelkezsre attl fggen, hogy milyen szerepet jtszik a program: protokoll helyi gpcm, helyi tvoli gpcm, tvoli process portszm processz portszm Kapcsolat orientlt szerver Kapcsolat orientlt kliens Kapcsolat nlkli szerver Kapcsolat nlkli klienssocket() socket() socket() socket() bind() bind() bind() bind() listen(),accept() connect() recvfrom() sendto()</p> <p>Lekrdezsre a getsockname() s a getpeername() rendszerhvsok szolglnak. Az accept() rendszerhvs eltt a szerver socket tvoli gpcme s tvoli processz portszma egy "mindent elfogad rtket" tartalmaz. Az accept() hatsra egy jabb socket keletkezik, s a rgi socket akr kpes lehet jabb krs kiszolglsra.</p> <p>BME Szmtgphlzatok jegyzet. Csak bels hasznlatra. Minden jog fenn tartva. Copyright 2000, BME Irnytstechnika s Informatika Tanszk -7-</p> <p>TCP/IP socket programozi interfsz</p> <p>8</p> <p>1.5 PROGRAMOZI INTERFSZ1.1.1 Socket ltrehozsa1.5.1.1 Socket</p> <p>#include #include int socket (int family, int type, int protocol);</p> <p>= file ler: OK, -1: hiba (kdja: errno) family: communications domain: kt konstans-kszlet adhatja meg, melyek pronknt azonosak: address family: cm formtuma protocol family: hlzati architektra : UNIX/Local domain: PF_UNIX = AF_UNIX Internet domain: PF_INET = AF_INET type: socket tpusa: jelenleg csak SOCK_STREAM, SOCK_DGRAM, SOCK_RAW van. protocol: a hasznland protokoll tpusa: 0: a default a family s a type szerint, vagy IPPROTO_ICMP, IPPROTO_IGMP, IPPROTO_TCP, IPPROTO_UDP,stb. ( -ban) 1.5.2 Socket hozzrendelse hlzati cmhez Ltrehozsa utn, elssorban szervernl kell, e nlkl (pl. a kliensnl) automatikusan egy egyedi cmhez rendeldik.</p> <p>1.5.2.1</p> <p>Bindint alen);</p> <p>int bind (int fd, struct sockaddr *addrp, Fd: File ler, melyet socket() adott, Addrp: Cmler struktra cme:</p> <p>struct sockaddr { ushort_t char };</p> <p>sa_family;</p> <p>/* mint socket()-ben 2 byte */ sa_data [14];</p> <p>BME Szmtgphlzatok jegyzet. Csak bels hasznlatra. Minden jog fenn tartva. Copyright 2000, BME Irnytstechnika s Informatika Tanszk -8-</p> <p>TCP/IP socket programozi interfsz vagy BSD4.4-ben:struct sockaddr { u_char sa_len; u_char sa_family; char sa_data [14]; }</p> <p>9</p> <p>De igazbl 16 byte-nl hosszabb is lehet, de ilyenn kell a cmt cast-olni. A socket hossznak lekrdezsre s belltsra a BSD 4.4-ben sa_len szolgl.</p> <p>1.5.3 Socket lezrsa1.5.3.1 Close</p> <p>close (int fd)</p> <p>Ekkor a mg t nem adott adatok elveszhetnek, vagy mg tvehetek, lsd SO_LINGER opci.1.5.3.2 Shutdown</p> <p>Csak kapcsolat-orientlt (connected) socket-re egyirny lezrsa socketnek.int shutdown (int fd, int how); /* =0 :OK, -1 :hiba how = 0: nem lehet tbb adatot tvenni a socket-tl, = 1: nem lehet tbb adatot tadni a socket-nek, = 2: egyik sem megy (ekvivalens a close()-al)</p> <p>*/</p> <p>1.5.4 Opcik belltsa ill. lekrdezse Melyeket a socket rteg dolgoz fel, gy protokoll-fggetlenek.int setsocketopt (int fd, int level, int cmd, char *arg, int len); int getsocketopt (int fd, int level, int cmd, char *arg, int *lenp); level: milyen szint mkdst lltunk be (pl. SOL_SOCKET: sockett) Pl. ha cmd = SO_ERROR, arg ltal mutatott int-be leteszi a hibakdot. Kvetkezkben a</p> <p>legfontosabbakat soroljuk fel: opcinv get set Lers md adat</p> <p>level</p> <p>BME Szmtgphlzatok jegyzet. Csak bels hasznlatra. Minden jog fenn tartva. Copyright 2000, BME Irnytstechnika s Informatika Tanszk -9-</p> <p>TCP/IP socket programozi interfszIP_OPTIONS IPPROTO_IP IP_INCLFDR TCP_MAXSEG IPPROTO_TCP TCP_NODELAY + SO_BROADCAS + T SO_DEBUG SO_DONTROU TE SO_ERROR SO_KEEPALIV E + + + + + + + + + + + + IP opcikval hozzfrs teljes IP header hozzfrhet maximlis TCP szegmens mret TCP adat azonnali elkldse (nagy ksleltets hlzaton ne alkalmazzuk) Broadcast engedlyezse/tiltsa Debuggols engedlyezse (Kernel specifikus zenetek) Ne routold az zenetet. A socket hibalekrdezse. Akkor is kldj, ha nincs mit kldeni, klnben a socket lebomlik. close() utn mennyi ideig problkozzon az elkldetlen adat elkldsvel. Az OOB adatok is kerljenek az inputra, vagy kln kelljen feldolgozni. Az olvassi buffer mretnek belltsa (A teljestmny vltoztatsnak eszkze) Az irsi buffer mretnek belltsa (A teljestmny vltoztatsnak eszkze) olvassi buffer alsrtke (byte-ban), ami meghatrozza, hogy mikor kell a socketnek feladni a megrkezett adatot irsi buffer alsrtke (byte-ban), ami meghatrozza, hogy mikor kell a hlzatnak tadni az elkldend adatot olvassi buffer alsrtke (idben), ami meghatrozza, hogy mikor kell a socketnek feladni a megrkezett adatot irsi buffer alsrtke bellt/leolvas engedlyez/tilt bellt/leolvas</p> <p>10</p> <p>void * int int</p> <p>engedlyez/tilt</p> <p>int</p> <p>SOL_SOCKET</p> <p>+ + +</p> <p>engedlyez/tilt engedlyez/tilt engedlyez/tilt bellt/leolvas engedlyez/tilt</p> <p>int int int int int</p> <p>SO_LINGER</p> <p>+</p> <p>+</p> <p>bellt/leolvas</p> <p>struct linger</p> <p>SO_OOBINLIN E</p> <p>+</p> <p>+</p> <p>engedlyez/tilt</p> <p>int</p> <p>SO_RCVBUF</p> <p>+</p> <p>+</p> <p>bellt/leolvas</p> <p>int</p> <p>SO_SNDBUF</p> <p>+</p> <p>+</p> <p>bellt/leolvas</p> <p>int</p> <p>SO_RCVLOWA T</p> <p>+</p> <p>+</p> <p>bellt/leolvas</p> <p>int</p> <p>SO_SNDLOWA T</p> <p>+</p> <p>+</p> <p>bellt/leolvas</p> <p>int</p> <p>SO_RCVTIMEO +</p> <p>+</p> <p>bellt/leolvas</p> <p>struct timeval</p> <p>SO_SNDTIMEO +</p> <p>+</p> <p>bellt/leolvas</p> <p>struct timeval</p> <p>BME Szmtgphlzatok jegyzet. Csak bels hasznlatra. Minden jog fenn tartva. Copyright 2000, BME Irnytstechnika s Informatika Tanszk - 10 -</p> <p>TCP/IP socket programozi interfsz(idben), ami meghatrozza, hogy mikor kell a hlzatnak tadni az elkldend adatot engedlyezi, hogy az 5st azonnal jra lehessen + hasznlni ami azonostja a kapcsolatot. A socket tpusnak IPv lekrdezse ill. cm 6 konvertlsa</p> <p>11</p> <p>SO_REUSEADD + R</p> <p>engedlyez/tilt</p> <p>int int</p> <p>SO_TYPE</p> <p>+</p> <p>bellt/leolvas</p> <p>1.5.5 Kapcsolat ltrehozsa Kt socket kztti kapcsolat ltrehozsa, tipikusan kliensben; stream: virtulis ramkr jn tre datagram: megjegyzi a clcmet, azt nem kell az egyes tviteleknl ksbb kln megadni, ill. tvenni csak a megadott cmrl jtt adatokat lehet. (Ha nincs bind-elve, connect() egy j cmhez rendeli hozz a socket-et.)1.5.5.1 Connect</p> <p>int connect (int fd, struct sockaddr *addrp, int alen); addrp: cl-cm (cmzett cme) fd, alen: mint bind() -nl</p> <p>= 0: OK, -1 : hiba, de a cm hozzrendelse (bind) ekkor is megmarad.1.5.5.2 Connect krsek elfogadsi szndknak jelzse s a queue mretnek belltsa(a szerver oldalon):</p> <p>Csak kapcsolat-orientlt socket-nl (SOCK_STREAM, SOCK_SEQPACKET)int listen (int fd, int backlog); backlog: hny feldolgozatlan connect</p> <p>krst trol (Nem teljesen, hanem egy</p> <p>exponencilis kplet szerint szmolja ki.) Ilyenkor egy n. passzv socket keletkezik.1.5.5.3 Connect elfogadsa (a szerver oldalon):</p> <p>Csak kapcsolat-orientlt socket-nl.int accept (in fd, struct sockaddr *addrp, int *alenp); addrp:ide teszi le a kliens cmt, ha nem rdekel, NULL</p> <p>BME Szmtgphlzatok jegyzet. Csak bels hasznlatra. Minden jog fenn tartva. Copyright 2000, BME Irnytstechnika s Informatika Tanszk - 11 -</p> <p>TCP/IP socket programozi interfsz*alenp:hvskor:</p> <p>12</p> <p>az addrp-knt tadott buffer hossza, visszatrskor: a kapott cm hossza. Ha nem rdekel, alenp==NULL = -1, ha hiba, = j file ler, ha sikeres, mely a kapott connect hvsnak felel meg, rkli a bemeneti fd tulajdonsgait, pl. tpus, protokoll. A bemeneti fd nem vesz rszt az gy elfogadott hvs tovbbi mveleteiben, hanem jabb accept hvsok fogadsra hasznlhat. Ha nincs ppen vrakoz connect krs, accept felfggeszti a hv processt. Nem tud eleve elutastani bizonyos hvsokat, de elfogads (accept) utn azonnal lezrhatjuk azokat. 1.5.6 Adatok kldse Kapcsolat-orientlt esetben hasznlhat a write() is, ezzel az tvitel a filemveletekhez hasonlan vgezhet, st a processz esetleg nem is tudja, hogy ppen socket-en t kommunikl. Tovbbi eszkzk csak kapcsolat-orientlt socket-re:</p> <p>1.5.6.1</p> <p>Sendint flags);</p> <p>int send (int fd, char *buf, int len, = -1: hiba, &gt;= 0: tvitt byte-szm</p> <p>flags: MSG_OOB: out-of-band: nagyobb prioritssal viszi t, ha a protokoll tmogatja ezt MSG_DONTROUTE: ha lehet, kzvetlenl a cmzettnek kldi, nem hasznl tvonal valasztst (csak loklis hlzaton mkdik). Kapcsolat nlkli socket-re is:1.5.6.2 Sendto</p> <p>int sendto (int fd, char *buf, int len, int flags, /* mint send() */ struct sockaddr *addrp, int alen); /* mint connect() */</p> <p>= -1: hiba, &gt;= 0 : tvitt byte-szm</p> <p>BME Szmtgphlzatok jegyzet. Csak bels hasznlatra. Minden jog fenn tartva. Copyright 2000, BME Irnytstechnika s Informatika Tanszk - 12 -</p> <p>TCP/IP socket programozi interfsz Legltalnosabb:1.5.6.3 Sendmsgint flags);</p>...